如何延迟从RecyclerView中删除项目

Mic*_*ael 8 animation android recycler-adapter android-recyclerview

我想用延迟(20s)的animatoin创建聊天列表.在这段时间之后,每个项目都应该消失,同时淡出动画.

如果我RecyclerView不使用滚动就没问题.我重写适配器中的方法,一切正常.

@Override
    public void onViewAttachedToWindow(final ViewHolder holder) {
        if(holder.alpha == null) {

            holder.alpha = ObjectAnimator.ofFloat(holder.itemView, View.ALPHA, 1f, 0f);

            holder.alpha.setDuration(300);
            holder.alpha.setStartDelay(20000);
            holder.alpha.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                holder.profilePic.setEnabled(false);
                holder.messageContainer.setEnabled(false);
                    if (items.size() > 0) {
                        items.remove(0);
                        notifyItemRemoved(0);
                    }

                }

                @Override
                public void onAnimationCancel(Animator animation) {
                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });
            holder.alpha.start();
        }
    }

    @Override
    public void onViewDetachedFromWindow(ViewHolder holder) {
        if(holder.alpha != null) {
            holder.alpha.cancel();
            holder.alpha = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在回收站视图中显示6条消息.

问题是何时启用滚动.(我没有使用onViewDetachedFromWindow启用滚动的方法).如果我使用解决方案(向上),那么我接受重复ViewHolder使用动画.每个itemViewViewHolder holder具有动画.如果接收到第7个消息,则此消息已经具有来自重用持有者的动画.但动画输入onViewAttachedToWindow再次为同一视图添加.

我无法找到每个消息的动画解决方案RecyclerView.我尝试使用LayoutAnimationController动画每个孩子或使用LayoutManager相同的.

测试电影:https: //www.dropbox.com/s/1sxdonpasq6lf0o/IMG_0262.MOV?dl = 0

任何的想法?

[编辑:]

// Hnalder to remove item from RecyclerView
Handler removeItems = new Handler() {
        @Override
        public void handleMessage(Message msg) {
           if(adapter != null && adapter.getItemCount() > 0) {
               adapter.removeFirst();
           }
        }
    };

... 
//Fragment::initRecyclerView
...
chatView.setLayoutManager(layoutManager);
chatView.setAdapter(adapter);
chatView.setItemAnimator(new ChatItemAnimator());


//ChatAdapter::removeFirst()
public void removeFirst() {
    items.removeFirst();
    notifyItemRemoved(0);
}

//ChatItemAnimator 
public class ChatItemAnimator extends BaseItemAnimator {
    @Override
    protected void animateRemoveImpl(RecyclerView.ViewHolder holder) {
        ViewCompat.animate(holder.itemView)
                .alpha(0)
                .setDuration(300)
                .setListener(new DefaultRemoveVpaListener(holder))
                .start();
    }
}
Run Code Online (Sandbox Code Playgroud)

Bou*_*ist 0

我有一个非常相似的案例,所以我建议您执行以下操作:

1-使用倒计时器为您的 chatListItem 创建一个自定义视图。

2- 使用自定义视图类中的 startTimer() 方法启动计时器,并在完成后销毁该项目。

3- 使用此回收器动画库为 ItemRemoved 上的项目制作动画。