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