1. ホーム
  2. android

RecyclerViewアダプタでデータを更新する最適な方法 [duplicate]

2023-11-19 16:15:38

質問

クラシックアダプタに リストビュー で使用する場合、ListView のデータをこのように更新します。

myAdapter.swapArray(data);

public swapArray(List<Data> data) {
  clear();
  addAll(data);
  notifyDataSetChanged();
}

のベストプラクティスを知りたいのですが。 RecyclerView . なぜなら RecyclerView アダプタでは clearaddAll のように リストビュー .

というわけで、試しに notifyDataSetChanged だけで試してみましたが、うまくいきませんでした。 そこで、ビューにswapAdapterを設定してみました。

List<Data> data = newData;

MyRecyclerAdapter adapter = new MyRecyclerAdapter(data);

// swapAdapter on my recyclerView (instead of a .setAdapter like with a classic listView).
recyclerViewList.swapAdapter(adapter, false);

しかし、この最後の解決策では、まだアダプタの新しいインスタンスを作成する必要があり、最良の解決策ではないように感じます。データを変更するだけなら、新しい MyRecyclerAdapter .

どのように解決するのですか?

RecyclerViewのAdapterには、ListViewのAdapterにあるようなメソッドがあまりありません。しかし、あなたのスワップは非常に簡単に次のように実装することができます。

class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
   List<Data> data;
   ...

    public void swap(ArrayList<Data> datas)
    {
        data.clear();
        data.addAll(datas);
        notifyDataSetChanged();     
    }
}

という違いもあります。

list.clear();
list.add(data);

list = newList;

一つ目は同じリストオブジェクトを再利用していること。もうひとつは、リストの再参照と参照です。到達できなくなった古いリスト オブジェクトはガベージ コレクションされますが、最初にヒープ メモリを積み上げることなく回収されることはありません。これは、データをスワップするたびに新しいアダプタを初期化するのと同じことでしょう。