[英]How to properly notifyItemMoved, insert and removed in RecyclerView old data list when i get new fresh list to assign to it
我一次在 RecyclerView 适配器中填充新数据,因此没有插入或删除一项操作。
很简单,我有一个旧列表,当发生某些事件时,我得到新列表,我可以将新列表分配给旧列表。
问题是我无法为旧列表中的每个项目正确制作动画
这是我现在拥有的东西,我认为它适用于第一种情况 - 项目移动到新位置:
if(currentAdapterData!= null){
for(int i = 0; i < currentAdapterData.size(); i++){
for(int j = 0; j < newData.size(); j++){
if(currentAdapterData.get(i).getSomeIdentifier().equals(newData.get(j).getSomeIdentifier())){
Log.v("same item", "currentAdapterData index :" + i + " ," + currentAdapterData.get(i).getSomeIdentifier() + " == newData index: " + j + " ," + newData.get(j).getSomeIdentifier());
if(i != j){
notifyItemMoved(i, j);
}
}
}
}
}
currentAdapterData = newData;
但是它没有按预期工作,并且日志(正确的)和手机上出现的列表(项目位置错误,一些重复,马车等)之间存在差异。
那么我怎样才能让它工作呢? 使用notifyItemMoved、notifyItemInserted 和notifyItemRemoved?
我不想只使用 NofifyDataSetChanged,因为它会刷新整个列表,而不仅仅是使用已更改的动画更新项目。
简单地使用 DiffUtil 就像
final MyDiffCallback diffCallback = new MyDiffCallback(prevList, newList); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
通过扩展 MyDiffCallback 和覆盖方法创建回调并根据需要执行。
public class MyDiffCallback extends DiffUtil.Callback
// 覆盖方法
好吧,我觉得这将是最简单的。只要按照它 ->
替换这个
if(currentAdapterData!= null){
for(int i = 0; i < currentAdapterData.size(); i++){
for(int j = 0; j < newData.size(); j++){
if(currentAdapterData.get(i).getSomeIdentifier().equals(newData.get(j).getSomeIdentifier())){
Log.v("same item", "currentAdapterData index :" + i + " ," + currentAdapterData.get(i).getSomeIdentifier() + " == newData index: " + j + " ," + newData.get(j).getSomeIdentifier());
if(i != j){
notifyItemMoved(i, j);
}
}
}
}
}
currentAdapterData = newData;
和
if(currentAdapterData!= null){
for(int i = 0; i < currentAdapterData.size(); i++){
for(int j = 0; j < newData.size(); j++){
if(currentAdapterData.get(i).getSomeIdentifier().equals(newData.get(j).getSomeIdentifier())){
Log.v("same item", "currentAdapterData index :" + i + " ," + currentAdapterData.get(i).getSomeIdentifier() + " == newData index: " + j + " ," + newData.get(j).getSomeIdentifier());
if(i != j){
notifyDataSetChanged();
new CountDownTimer(250, 250) {
@Override
public void onTick(long millisUntilFinished) {
Log.d("millisUntilFinished", "" + millisUntilFinished);
}
@Override
public void onFinish() {
notifyItemMoved(i, j);
}
}.start();
}
}
}
}
}
这将更新值,并在 250 毫秒(每秒 1/4 秒)后,随着动画移动该值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.