所以想象一下,我们首先在RecyclerView中加载10个项目。添加或删除一个元素会给我们一个很好的动画(适配器具有稳定的ID)。
问题是,我有一个搜索栏,我可以找一些东西然后结果应该替换RecyclerView的当前项目。如果某个项目已经存在,那么有一个很好的"移动"动画。但是,如果所有项目都是新的,那么有一个非常难看的淡入过渡,它过快而且看起来像一个小故障。是否可以覆盖该动画?我希望淡出淡出淡出淡出淡出淡出。
顺便说一句,当查询返回结果时,我在适配器中执行此操作:
mItems.clear();
mItems.addAll(resultItems);
notifyDataSetChanged();
另外,值得一提的是,如果我搜索没有结果,那么我看到RecyclerView为空,然后如果我再次获得一些结果,则从空状态转换到某些结果看起来没问题。< / p>
答案 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);
}