如何延迟从RecyclerView中删除项目

时间:2016-02-11 15:16:24

标签: android animation android-recyclerview recycler-adapter

我想用延迟(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;
        }
    }

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

问题是启用滚动时。 (我没有使用方法onViewDetachedFromWindow来启用滚动)。如果我使用解决方案(up),那么我会重新使用动画重用ViewHolder。来自itemView的每个ViewHolder 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();
    }
}

1 个答案:

答案 0 :(得分:0)

我有一个非常相似的案例,所以我建议你做以下事情:

1-使用CountdownTimer为您的chatListItem创建自定义视图。

2-使用customview类中的startTimer()方法启动计时器,然后销毁已完成的项目。

3-使用此recyler animation library为ItemRemoved上的项目设置动画。