2016-07-29 13 views
2

Ich habe ein Element in RecyclerView, die nicht aktualisiert werden muss, wenn ich notifyDataSetChanged aufrufen.Wie man das angegebene Element nicht aktualisiert, wenn notifyDataSetChanged in RecyclerView

Aber ich habe keine Methoden gefunden, um das angegebene Element zu vermeiden, aktualisiert. Ist es möglich, dies zu tun?


Ich muss dies tun, weil das Element ein WebView ist, hat es eine HTML-Seite geladen hatte, wenn ich notifyDataSetChanged genannt, wird dieses Element blinken.

Der Grund, warum ich diese Frage stelle, ist die Vermeidung des Blitzes von WebView wenn notifyDataSetChanged (siehe this quesion). Nach dem Scheitern der Verwendung von notifyItemRangeXXX Methoden, posten ich diese Frage.

Aber nachdem Sie Ihre Antworten und Kommentare überprüft haben, scheint es unmöglich zu sein, die Aktualisierung zu vermeiden, wenn Sie notifyDataSetChanged verwenden.

+1

Wenn Sie es nicht aktualisieren möchten, ändern Sie nicht die Datenquelle –

+0

Wenn möglich, können Sie auch 'notifyItemChanged (pos)' für andere außer dem betreffenden Element verwenden. – Shaishav

+0

Wenn Sie RecyclerView.Adapter usign sind. Sie könnten die Methoden notifyItemChanged (int position), notifyItemRangeChanged (int positionStart, int itemCount) in Betracht ziehen –

Antwort

2

Der Zweck von notifyDataSetChanged IST, ALLE Elemente zu aktualisieren. Verwenden Sie es nicht, wenn Sie dieses Verhalten nicht möchten!

Der richtige Ansatz wäre, nur die Daten zu aktualisieren, die Sie geändert haben. Es gibt einige Methoden, mit denen Sie nur die gewünschten Daten ungültig machen können:

notifyItemChanged(int position) 
notifyItemInserted(int position) 
notifyItemMoved(int fromPosition, int toPosition) 
notifyItemRangeChanged(int positionStart, int itemCount) 
notifyItemRangeRemoved(int positionStart, int itemCount) 
notifyItemRemoved(int position) 
1

Sie sollten anders denken - welche Elemente müssen aktualisiert werden. Um die UI des Artikels zu aktualisieren, nachdem Daten geändert wurden, verwenden Sie die Methode notifyitemchanged

2

Ja, es ist tatsächlich möglich, dies zu tun. notifyDataSetChanged() benachrichtigt den RecyclerView, dass alle Elemente in dem Datensatz geändert hat.

Da Sie nicht möchten, dass bestimmte Elemente auftreten und auszuschließen.

for(int i = 0; i< mAdapter.getItemCount(); i++){ 
    if(i != itemPositionToExclude){ 
     mAdapter.notifyItemChanged(i); 
    } 
} 

Wir brauchen also eine Schleife durch alle Elemente in dem Adapter und rufen notifyItemChanged() nur für diese Positionen which you do not want to exclude.