调用notifyitemchanged后的动画问题

时间:2016-07-05 06:25:55

标签: android android-animation android-glide

我使用 Glide 加载图片ImageView。当我执行喜欢操作时,请使用notifyItemChanged(position)通知回收站视图适配器。它会使图像闪烁2次。 任何人都可以帮助我。

这部分代码在调用notifyItemChanged(position)时执行:

    Glide.with(mContext)
    .load(mainImage)
    .placeholder(R.color.grey_light)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(listItemHolder.mSingleAttachmentImage);

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为图像的闪烁是由ItemAnimator的{​​{1}}引起的。我遇到了同样的问题,我通过添加默认动画师并告诉回收者视图重新使用视图持有者来解决动画问题。像这样:

RecylerView

通过这种方式,RecyclerView可以使用相同的ViewHolder,并且在调用notifyItemChange时不会创建另一个ViewHolder。

答案 1 :(得分:1)

解决方案1:

ItemAnimator animator = mRecyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
    ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
  

ref https://github.com/bumptech/glide/issues/1599


解决方案2:

notifyItemChanged(int position)> notifyItemRangeChanged(int positionStart, int itemCount)> notifyItemRangeChanged(positionStart, itemCount, null);

/**
         * Notify any registered observers that the item at <code>position</code> has changed with an
         * optional payload object.
         *
         * <p>This is an item change event, not a structural change event. It indicates that any
         * reflection of the data at <code>position</code> is out of date and should be updated.
         * The item at <code>position</code> retains the same identity.
         * </p>
         *
         * <p>
         * Client can optionally pass a payload for partial change. These payloads will be merged
         * and may be passed to adapter's {@link #onBindViewHolder(ViewHolder, int, List)} if the
         * item is already represented by a ViewHolder and it will be rebound to the same
         * ViewHolder. A notifyItemRangeChanged() with null payload will clear all existing
         * payloads on that item and prevent future payload until
         * {@link #onBindViewHolder(ViewHolder, int, List)} is called. Adapter should not assume
         * that the payload will always be passed to onBindViewHolder(), e.g. when the view is not
         * attached, the payload will be simply dropped.
         *
         * @param position Position of the item that has changed
         * @param payload Optional parameter, use null to identify a "full" update
         *
         * @see #notifyItemRangeChanged(int, int)
         */
        public final void notifyItemChanged(int position, Object payload) {
            mObservable.notifyItemRangeChanged(position, 1, payload);
        }

通知@param payload Optional parameter, use null to identify a "full" update

您可以使用notifyItemChanged(position,position)并在RecyclerView.Adapter.onBindViewHolder()中进行changeView