Android只需点击一个按钮即可移除所有带有动画的recyclerview

Android只需点击一个按钮即可移除所有带有动画的recyclerview,android,animation,android-recyclerview,android-animation,Android,Animation,Android Recyclerview,Android Animation,我有一个回收者的观点。单击按钮后,我想从recyclerview中删除所有项目,但必须通过动画删除这些项目。 我可以一次删除所有的项目,但我不知道如何删除它们的动画。谢谢是一个非常好的库,更好的是它的文档。甚至可以为过渡和动画插入持续时间 另外,请记住,如果使用默认动画,则在调用myDataSet.remove(pos)后,使用adapter.notifyDataSetChanged()当动画正在进行时,将导致动画停止。扩展库的BaseItemAnimator类: 公共类MyAdapter扩展

我有一个回收者的观点。单击按钮后,我想从recyclerview中删除所有项目,但必须通过动画删除这些项目。 我可以一次删除所有的项目,但我不知道如何删除它们的动画。谢谢

是一个非常好的库,更好的是它的文档。甚至可以为过渡和动画插入持续时间


另外,请记住,如果使用默认动画,则在调用myDataSet.remove(pos)后,使用
adapter.notifyDataSetChanged()
当动画正在进行时,将导致动画停止。

扩展库的BaseItemAnimator类:


公共类MyAdapter扩展了RecyclerView.Adapter这就是我在不使用任何库的情况下所做的工作-通过在循环中插入延迟来删除项和恢复(如果需要)

clearItemsView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终列表LineItemScope=新的ArrayList(lineItems);
新线程(newrunnable()){
@凌驾
公开募捐{

对于(int i=0;i它很旧,但希望它能帮助其他人,因为它还没有回答;我通过模拟此项目上的滑动动画一次删除一个项目来完成此操作,并在删除下一个项目之前延迟一段时间,依此类推,直到
RecyclerView

第1步:

在按住“全部清除”按钮和
RecyclerView
实例的活动中:创建单个项目删除方法

private void deleteItem(View rowView, final int position) {

    Animation anim = AnimationUtils.loadAnimation(requireContext(),
            android.R.anim.slide_out_right);
    anim.setDuration(300);
    rowView.startAnimation(anim);

    new Handler().postDelayed(new Runnable() {
        public void run() {
            if (myDataSource.size() == 0) {
                addEmptyView(); // adding empty view instead of the RecyclerView
                return;
            }
            myDataSource.remove(position); //Remove the current content from the array
            myRVAdapter.notifyDataSetChanged(); //Refresh list
        }

    }, anim.getDuration());
}
第2步:

创建将删除所有
RecyclerView
list items>>的方法,并在您的按钮中调用它,然后单击callback

boolean mStopHandler = false;

private void deleteAllItems() {

    final Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {

            if (myDataSource.size() == 0) {
                mStopHandler = true;
            }

            if (!mStopHandler) {
                View v = myRecyclerView.findViewHolderForAdapterPosition(0).itemView;
                deleteItem(v, 0);
            } else {
                handler.removeCallbacksAndMessages(null);
            }

            handler.postDelayed(this, 250);
        }
    };
    requireActivity().runOnUiThread(runnable);
}
另外,在清单的“活动”部分处理配置更改也很重要,因为如果在清除回收器视图列表时配置更改,则会引发异常

<activity
    android:name=".activities.MainActivity"
    android:configChanges="orientation|screenSize|keyboard"
    android:label="@string/app_name">
    ...
</activity>

...

您可以使用此库或此库。我想一次删除所有元素。我不知道如何实现这一点。它们将根据您的循环方式按特定顺序运行,因此请尝试计数器:同时执行
myDataSet.remove(pos)
adapter.notifyDataSangeetched()
按顺序从每个项目开始。或者您可以尝试使用我在命令中提到的相同库
recyclerView.getItemAnimator().setRemoveDuration(1)
谢谢,随着动画的褪色,视图正在消失。我可以用相同的代码制作幻灯片动画吗?您可以扩展SimpleItemImator类并实现所需的动画。这里的示例:您还可以使用@MRX建议和库。使用起来很简单:将compile“jp.wasabeef:recyclerview animators:2.2.6”添加到y我们的应用程序build.gradle并调用recyclerView.setItemAnimator(新的SlideInLeftAnimator());我已经尝试了该库&也称为rView.setItemAnimator(新的SlideInLeftAnimator());但问题是,我的所有元素都只是一次向左滑动,我想要的是一次将一个项目设置为向左的动画。就像一个视图向左滑动一样,第二个也是最后一个可见的项目从库的leftExtend BaseItemAnimator类滑出(请参见上面的MyScaleInLeftAnimator类)。
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();
        }
    });
private void deleteItem(View rowView, final int position) {

    Animation anim = AnimationUtils.loadAnimation(requireContext(),
            android.R.anim.slide_out_right);
    anim.setDuration(300);
    rowView.startAnimation(anim);

    new Handler().postDelayed(new Runnable() {
        public void run() {
            if (myDataSource.size() == 0) {
                addEmptyView(); // adding empty view instead of the RecyclerView
                return;
            }
            myDataSource.remove(position); //Remove the current content from the array
            myRVAdapter.notifyDataSetChanged(); //Refresh list
        }

    }, anim.getDuration());
}
boolean mStopHandler = false;

private void deleteAllItems() {

    final Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {

            if (myDataSource.size() == 0) {
                mStopHandler = true;
            }

            if (!mStopHandler) {
                View v = myRecyclerView.findViewHolderForAdapterPosition(0).itemView;
                deleteItem(v, 0);
            } else {
                handler.removeCallbacksAndMessages(null);
            }

            handler.postDelayed(this, 250);
        }
    };
    requireActivity().runOnUiThread(runnable);
}
<activity
    android:name=".activities.MainActivity"
    android:configChanges="orientation|screenSize|keyboard"
    android:label="@string/app_name">
    ...
</activity>