L'Adaptateur RecyclerView notifiedatase changed ne fonctionne pas
j'ai étendu
RecyclerView.Adapter<RecyclerView.ViewHolder>
et quand j'ai appelé:
mRecyclerView.getAdapter().notifyDataSetChanged();
il ne s'est rien passé.
La seule manière d'actualiser l'affichage est de nouveau l'adaptateur ( voir cette réponse ):
mRecyclerView.setAdapter(new MyAdapter(...));
j'ai deux problèmes avec cette solution:
- je peux voir un clignotement sur l'écran quand je mets à nouveau l'adaptateur
- le listview retourne à la première position.
des idées?
7 réponses
si notifyDataSetChanged()
ne déclenche pas les mises à jour de la vue, il y a une chance que vous ayez oublié d'appeler SetLayoutManager()
sur votre RecyclerView (comme je l'ai fait!).
N'oubliez pas de faire ceci:
var manager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
_list.SetLayoutManager(manager);
avant d'appeler SetAdapter()
;
désolé pour le code C, j'utilise de la Xamarine.
si votre getItemCount()
renvoie 0, alors notifyDataSetChanged()
ne fera rien. Assurez-vous que lorsque vous initialisez votre adaptateur, vous passez 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. Utilisez 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();
}
je suis à l'aide de Rénovation pour aller chercher de la liste, sur la Rénovation du onResponse (),
adapter.swap(feedList);
voulez-vous partager quelque chose, je faisais face à la même question. Mais ce que je faisais de mal était. Je créais instance de L'Adaptateur chaque fois nouveau et que je faisais notifysetDatachange() à cette nouvelle instance pas l'ancienne.
alors s'il vous plaît assurez-vous que L'Adaptateur que vous avisez soit plus ancien. L'exemple de l'espoir ci-dessous AIDE..
MyAdapter mAdapter = new MyAdapter(...)
mRecyclerView.setAdapter(mAdapter );
// TODO
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();
MyAdapter extends baseAdapter {
MyAdapter () {
}
modifyData(String[] listData) {
}
}
pour mettre à jour recyclerview nous pouvons faire ce qui 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();
donc j'ai corrigé mon problème comme ceci : orderList est la liste que je transmets au recyclerview . Il suffit d'ajouter l'élément à la position dans la liste, ici 0 est le 0e position dans la Liste . Alors appelez adaptateur.notifydatase changed() . Fonctionne comme un charme
1) orderList.add (0, String); 2) orderAdapter.notifydatasetachanged ();
notifydatase changed () sholud doit être appelé dans le fil principal.