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:

  1. je peux voir un clignotement sur l'écran quand je mets à nouveau l'adaptateur
  2. le listview retourne à la première position.

des idées?

24
demandé sur Community 2014-12-31 02:32:38

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.

21
répondu Varvara Kalinina 2016-10-24 14:00:00

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.

20
répondu Igor Ganapolsky 2015-10-14 22:11:38

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);
4
répondu Akshay Goyal 2015-12-24 06:41:14

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) {

    }

    }
0
répondu sharma_kunal 2017-01-13 21:39:40

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();
0
répondu Mayur 2018-02-02 13:31:29

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 ();

0
répondu Partha Sarathi Murmu 2018-08-28 11:51:13

notifydatase changed () sholud doit être appelé dans le fil principal.

-4
répondu inhogo 2017-02-08 07:31:56