0

StaggeredGridLayoutManagerに基づいて2列のRecyclerViewがあります。RecylerView StaggeredGridLayotManagerを使用してdiffUtilの変更後に2つの要素にジャンプ

1項目の内容を変更してdiffUtilをトリガすると、RecyclerViewは2項目にジャンプしています。しかしスクロールすると、1要素と空白が見えるようになり、スクロールアイテムは自然な順序に変換されます。また、diffリスト内のアイテムの量も同じです。

この厄介な動作を回避し、diffUtil中にスクロール位置を維持するにはどうすればよいですか?

val layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL) 
    recyclerView.layoutManager = layoutManager 
    recyclerView.itemAnimator = null 
    recyclerView.setHasFixedSize(true) 
    recyclerView.setItemViewCacheSize(if (App.isTablet()) 3 else 2) 

public void diffUpdate(List<T> newList) { 
    if (getCollection().size() == 0) { 
     addAll(newList); 
     notifyDataSetChanged(); 
    } else { 
     DiffCallback diffCallback = new DiffCallback<T>(getCollection(), newList); 
     DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); 
     clear(); 
     addAll(newList); 
     diffResult.dispatchUpdatesTo(this); 
    } 
    } 

答えて

0

DiffCallbackの実装に問題がありました。以前の私は、ハッシュを使用:

@Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { 
     T oldItem = oldList.get(oldItemPosition); 
     T newItem = newList.get(newItemPosition); 
     boolean areTheSameInstance = oldItem == newItem; 
     boolean hasTheSameType = oldItem.getClass().equals(newItem.getClass()); 
     boolean hasTheSameHash = oldItem.hashCode() == newItem.hashCode(); 
     return areTheSameInstance || hasTheSameType && hasTheSameHash; 
    } 

これはRecyclerViewでビュー全体のレクリエーションをトリガし、おそらくStaggeredGridLayoutManagerで測定しました。

idチェックに変更した後、diffCalbbackは、RecyclerViewのビューのレンダリングだけをトリガするようになりました。

return ((Model) oldItem).id() == ((Model) newItem).id(); 
関連する問題