-1

RecyclerViewアダプタに新しいデータを一度に入力するので、アイテムの挿入や削除は一切ありません。適切にNotifyItemMovedを挿入、削除し、RecyclerView古いデータリストに新鮮なリストを割り当てるとき

単純に、私は古いリストを持っており、あるイベントが発生したときに新しいリストを取得して、新しいリストを古いものに割り当てることができます。

問題があった場合にアイテムが新しいリスト(旧位置から新にすべきnotifyItemMoved)

  • に新しいポジションを持っているとき、私は、古いリストの各項目について適切にアニメーション

    • 作ることができないです新しいリストに新しい項目(新しいリスト内のその位置でをnotifyItemInserted必要があります)
    • 古い項目が新しいリストに存在しない(その位置でnotifyItemRemoved必要があります)
    ここで

    私は最初のケースのために働くだろうと思った私は今持っている何か、である - 新しい位置にアイテム移動:しかし、予想通り、それはない作品

     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を使用したくありません。

  • +0

    これはあなたのHEPすべきhttps://stackoverflow.com/questions/31367599/how-to-update-recyclerview-adapter-data – Anonymous

    答えて

    1

    新しいデータはリストの形式であり、単一のアイテムではないようです。私は、これがサポートライブラリのDiffUtilを使用するための良い候補かもしれないと思います。 Hereもいいチュートリアルです。

    新しいデータの差異を計算し、必要なフィールドのみを更新することができます。また、作業を非同期でオフロードします。

    商品が同じか内容が同じかどうかを示すには、DiffUtil.Callbackを実装するだけです。

    あなたはそのようなあなたのrecyclerViewを更新:

    DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); 
    diffResult.dispatchUpdatesTo(yourAdapter); 
    
    +0

    」に、不要な防ぐために、そこの方法ですblink "をnotifyDataSetChangedから削除し、itemMove、Added、Removed animationsだけを表示しますか? – Konrad

    +0

    notifyDataSetChangedを使用するべきではありません。更新された使用法の答えを見てください。 – elmorabea

    +0

    自動スクロールを無効にする方法はありますか?ここに記載されているように:https://stackoverflow.com/questions/47632693/recyclerview-using-diffutil-prevent-to-scroll-bottom-on-change – Konrad

    0

    単にMyDiffCallbackを拡張することでコールバックを作成し、必要に応じてメソッドをオーバーライドしてください

    final MyDiffCallback diffCallback = new MyDiffCallback(prevList, newList); final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);

    ようDiffUtilを使用しています。

    public class MyDiffCallback extends DiffUtil.Callback 
    

    //オーバーライドメソッド

    +0

    notifyDataSetChangedから不要な「点滅」を防ぎ、itemMoveだけを表示する方法はありますか、追加、削除されたアニメーション? – Konrad

    +0

    次にnotifydatasetchangedを呼び出さないで、notifyitemrangechanged(0、listsize)を呼び出すと、これは役に立ちます –

    +0

    自動スクロールを無効にする方法はありますか?ここに記載されているように:https://stackoverflow.com/questions/47632693/recyclerview-using-diffutil-prevent-to-scroll-bottom-on-change – Konrad

    関連する問題