清除整个适配器并添加新元素时的RecyclerView动画

时间:2015-11-13 19:36:55

标签: android android-animation android-recyclerview

所以想象一下,我们首先在RecyclerView中加载10个项目。添加或删除一个元素会给我们一个很好的动画(适配器具有稳定的ID)。

问题是,我有一个搜索栏,我可以找一些东西然后结果应该替换RecyclerView的当前项目。如果某个项目已经存在,那么有一个很好的"移动"动画。但是,如果所有项目都是新的,那么有一个非常难看的淡入过渡,它过快而且看起来像一个小故障。是否可以覆盖该动画?我希望淡出淡出淡出淡出淡出淡出。

顺便说一句,当查询返回结果时,我在适配器中执行此操作:

mItems.clear();
mItems.addAll(resultItems);
notifyDataSetChanged();

另外,值得一提的是,如果我搜索没有结果,那么我看到RecyclerView为空,然后如果我再次获得一些结果,则从空状态转换到某些结果看起来没问题。< / p>

2 个答案:

答案 0 :(得分:1)

您可以在RecyclerView

中批量删除和插入项目
adapter.notifyItemRangeRemoved(0, mItems.size());
mItems.clear();
mItems.addAll(resultItems);
adapter.notifyItemRangeInserted(0, mItems.size());
编辑:在看了你的问题后,你可能不想做我上面提到的建议。相反,您不应清除列表,而是删除一些项目,然后通过notifyItemRemove(index)

通知适配器更改

答案 1 :(得分:0)

如果您使用RangeRemoved / RangeAdded之类的范围方法,则会在动画方面松动。因此,在循环中逐个执行以逐个保留动画效果,包括循环中的延迟。以下是我的实施方式:

<强> MainActivity.java

clearItemsView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final List<LineItem> lineItemsCopy = new ArrayList<>(lineItems);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i=0; i<lineItemsCopy.size(); i++) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                salesOrderItemListAdapter.removeItem(0);
                            }
                        });
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            Snackbar snackbar = Snackbar.make(coordinatorLayout, getString(R.string.items_cleared_message), Snackbar.LENGTH_LONG)
                    .setAction(getString(R.string.label_undo), new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    for (int i=0; i<lineItemsCopy.size(); i++) {
                                        final int finalI = i;
                                        runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                salesOrderItemListAdapter.restoreItem(lineItemsCopy.get(finalI), 0);
                                            }
                                        });
                                        try {
                                            Thread.sleep(500);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                            }).start();
                        }
                    }).setActionTextColor(Color.YELLOW);
            snackbar.show();
        }
    });

<强> RecyclerViewAdapter.java

    //Only remove & restore functions are shown    
    public void removeItem(int position) {
        lineItems.remove(position);
        notifyItemRemoved(position);
    }

    public void restoreItem(LineItem item, int position) {
        lineItems.add(position, item);
        notifyItemInserted(position);
    }