J'ai étendu
RecyclerView.Adapter<RecyclerView.ViewHolder>
Et quand j'ai appelé:
mRecyclerView.getAdapter().notifyDataSetChanged();
Rien ne s'est passé.
La seule façon d'actualiser la vue consiste à configurer à nouveau l'adaptateur ( voir cette réponse ):
mRecyclerView.setAdapter(new MyAdapter(...));
J'ai deux problèmes avec cette solution:
Des idées?
Si notifyDataSetChanged()
ne déclenche pas les mises à jour de la vue, vous avez peut-être oublié d'appeler SetLayoutManager()
sur votre RecyclerView (comme je l'ai fait!) . N'oubliez pas de faire ceci: code Java:
LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager)
Code C #, j'utilise Xamarin.
var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
recyclerView.SetLayoutManager(layoutManager);
avant d'appeler recyclerView.SetAdapter(adapter)
;
Si votre getItemCount()
renvoie 0, alors notifyDataSetChanged()
ne fera rien. Assurez-vous que lorsque vous initialisez votre adaptateur, vous transmettez un ensemble de données valide.
Selon les javadocs: Si vous écrivez un adaptateur, il sera toujours plus efficace d’utiliser les événements de changement plus spécifiques si vous le pouvez. Comptez sur notifyDataSetChanged()
en dernier recours.
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, à l'usage de Retrofit onResponse (),
adapter.swap(feedList);
Pour mettre à jour recyclerview, nous pouvons procéder comme suit:
1. Create and set adapter again:
adapter=new MyAdapter(...);
mRecyclerView.setAdapter(adapter);
2. Clear model list data and then notify:
ArrayList<YourModel> tempModel=new ArrayList<>(modelList);
modelList.clear();
modelList.addAll(tempModel);
adapter.notifyDataSetChanged();
Envie de partager quelque chose, je faisais face au même problème. Mais ce que je faisais mal, c’était… .. Je créais une instance de Adapter à chaque fois nouvelle et que de ne pas notifysetDatachange () à cette nouvelle instance et non à la plus ancienne.
Assurez-vous donc que l’adaptateur dont vous avez notifié la modification de la échange de données () doit être plus ancien.
MyAdapter mAdapter = new MyAdapter(...)
mRecyclerView.setAdapter(mAdapter );
// TODO
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();
MyAdapter extends baseAdapter {
MyAdapter () {
}
modifyData(String[] listData) {
}
}
J'ai donc résolu mon problème comme suit: orderList est la liste que je transmets à Recyclerview. Nous pouvons simplement ajouter l'item à la position dans la liste, ici 0 est la 0 position dans la liste. Appelez ensuite adapter.notifyDataSetChanged (). Fonctionne comme un charme
1) orderList.add (0, String); 2) orderAdapter.notifyDataSetChanged ();