web-dev-qa-db-fra.com

Adaptateur RecyclerView notifyDataSetChanged ne fonctionne pas

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:

  1. Je peux voir un clignotement sur l'écran quand je repasse l'adaptateur
  2. La listview revient à la première position.

Des idées?

25
David

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

23
Varvara Kalinina

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.

20
IgorGanapolsky

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);
4
Akshay Goyal

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();
1
Mayur Prasad

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

    }

    }
0
sharma_kunal

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

0