Meilleur moyen de mettre à jour des données avec un adaptateur RecyclerView

Lorsque je dois utiliser un adaptateur classique avec un ListView , je mets à jour mes données dans ListView comme ceci:

myAdapter.swapArray(data); public swapArray(List data) { clear(); addAll(data); notifyDataSetChanged(); } 

Je voudrais savoir quelle est la meilleure pratique pour un RecyclerView . Parce que dans un adaptateur RecyclerView, vous ne pouvez pas clear et addAll comme dans ListView .

Donc j’ai essayé juste avec notifyDataSetChanged , mais ça n’a pas fonctionné. Puis j’ai essayé avec un swapAdapter sur ma vue:

 List data = newData; MyRecyclerAdapter adapter = new MyRecyclerAdapter(data); // swapAdapter on my recyclerView (instead of a .setAdapter like with a classic listView). recyclerViewList.swapAdapter(adapter, false); 

Mais avec cette dernière solution, je dois encore créer une nouvelle instance de mon adaptateur et je pense que ce n’est pas la meilleure solution. Je devrais pouvoir simplement changer mes données sans un nouveau MyRecyclerAdapter .

L’adaptateur de RecyclerView ne comprend pas beaucoup de méthodes disponibles dans l’adaptateur ListView. Mais votre swap peut être implémenté tout simplement comme:

 class MyRecyclerAdapter extends RecyclerView.Adapter { List data; ... public void swap(ArrayList datas) { if(datas == null || datas.size()==0) return; if (data != null && data.size()>0) data.clear(); data.addAll(datas); notifyDataSetChanged(); } } 

Il y a aussi une différence entre

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

et

 list = newList; 

Le premier consiste à réutiliser le même object liste. L’autre consiste à déréférencer et à référencer la liste. L’ancien object de liste qui ne peut plus être atteint sera récupéré mais pas sans emstackr d’abord la mémoire de tas. Cela revient à initialiser un nouvel adaptateur à chaque fois que vous souhaitez échanger des données.

La réponse de @inmyth est correcte, il suffit de modifier un peu le code pour gérer la liste vide.

 public class NewsAdapter extends RecyclerView.Adapter<...> { ... private static List mFeedsList; ... public void swap(List list){ if (mFeedsList != null) { mFeedsList.clear(); mFeedsList.addAll(list); } else { mFeedsList = list; } notifyDataSetChanged(); } 

J’utilise Retrofit pour récupérer la liste, sur l’utilisation de onResponse () Retrofit,

 adapter.swap(feedList); 

DiffUtil est le meilleur choix pour mettre à jour les données de l’adaptateur RecyclerView que vous pouvez trouver dans le framework Android. DiffUtil est une classe d’utilitaires qui peut calculer la différence entre deux listes et générer une liste des opérations de mise à jour qui convertissent la première liste dans la seconde.

La plupart du temps, notre liste change complètement et nous définissons une nouvelle liste sur RecyclerView Adapter. Et nous appelons notifyDataSetChanged pour mettre à jour l’adaptateur. NotifyDataSetChanged est coûteux. La classe DiffUtil résout maintenant ce problème. Il fait parfaitement son travail!

Solution suivante trouvée pour mon problème similaire:

 private ExtendedHashMap mData = new ExtendedHashMap(); private Ssortingng[] mKeys; public void setNewData(ExtendedHashMap data) { mData.putAll(data); mKeys = data.keySet().toArray(new Ssortingng[data.size()]); notifyDataSetChanged(); } 

Utilisation de la commande d’effacement

 mData.clear() 

n’est pas nessescary