wake-up-neo.com

RecyclerView Adapter notifyDataSetChanged funktioniert nicht

Ich verlängerte 

RecyclerView.Adapter<RecyclerView.ViewHolder>

Und als ich anrief:

mRecyclerView.getAdapter().notifyDataSetChanged();

Nichts ist passiert. 

Die einzige Möglichkeit, die Ansicht zu aktualisieren, besteht darin, den Adapter erneut einzustellen ( siehe diese Antwort ):

mRecyclerView.setAdapter(new MyAdapter(...));

Ich habe zwei Probleme mit dieser Lösung:

  1. Ich kann auf dem Bildschirm ein Blinken sehen, wenn ich den Adapter erneut einstelle
  2. Die Listenansicht kehrt zur ersten Position zurück.

Irgendwelche Ideen?

25
David

Wenn notifyDataSetChanged() keine Ansichtsaktualisierungen auslöst, besteht die Möglichkeit, dass Sie vergessen haben, SetLayoutManager() in Ihrer RecyclerView aufzurufen (wie ich es getan habe!) . Vergessen Sie nicht, Folgendes zu tun: Java-Code:

LinearLayoutManager layoutManager = new LinearLayoutManager(context ,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager)

C # -Code, ich verwende Xamarin.

var layoutManager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false);
recyclerView.SetLayoutManager(layoutManager);

bevor Sie recyclerView.SetAdapter(adapter) aufrufen;

23

Wenn Ihre getItemCount() 0 zurückgibt, wird notifyDataSetChanged() nichts tun. Stellen Sie sicher, dass Sie beim Initialisieren Ihres Adapters ein gültiges Dataset übergeben.

20
IgorGanapolsky

Gemäß den Javadocs: Wenn Sie einen Adapter schreiben, ist es immer effizienter, die spezifischeren Änderungsereignisse zu verwenden, wenn Sie können. Verlassen Sie sich auf notifyDataSetChanged() als letzten Ausweg.

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

Ich verwende Retrofit, um die Liste abzurufen, wenn Retrofits onResponse () verwendet wird.

adapter.swap(feedList);
4
Akshay Goyal

Um das Recycling zu aktualisieren, können wir Folgendes tun:

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

Möchten Sie etwas mitteilen, stand ich vor demselben Problem. Aber was ich falsch gemacht habe, war . Ich habe jedes Mal eine neue Instanz von Adapter erstellt und notifysetDatachange () für diese neue Instanz nicht die ältere.

Stellen Sie also sicher, dass der Adapter, dem Sie notifysetDatachange () älter sind.

     MyAdapter mAdapter = new MyAdapter(...)

    mRecyclerView.setAdapter(mAdapter );

// TODO 
mAdapter.modifyData(....);
mAdapter.notifySetDataChange();


    MyAdapter extends baseAdapter {
     MyAdapter () {
    }
    modifyData(String[] listData) {

    }

    }
0
sharma_kunal

Also habe ich mein Problem so behoben: orderList ist die Liste, die ich an das Recycling weitergebe. Wir können das Element einfach an der Position in der Liste hinzufügen, hier ist 0 die 0-te Position in der Liste. Rufen Sie dann adapter.notifyDataSetChanged () auf. Klappt wunderbar 

1) orderList.add (0, String); 2) orderAdapter.notifyDataSetChanged ();