19

ho estesoRecyclerView adattatore non notifyDataSetChanged lavoro

RecyclerView.Adapter<RecyclerView.ViewHolder> 

e quando ho chiamato:

mRecyclerView.getAdapter().notifyDataSetChanged(); 

Non è successo niente.

L'unico modo per aggiornare la vista è quello di impostare di nuovo l'adattatore (see this answer):

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

ho due problemi con questa soluzione:

  1. posso vedere un lampeggio sullo schermo quando ho impostato di nuovo l'adattatore
  2. Il listview ritorna alla prima posizione.

Qualche idea?

+0

Hai provato a incapsulare metodo notifyDataSetChanged in MyAdapter? Es: Crea "myNotifyDataSetChanged" in MyAdapter e da questo metodo chiama this.notifyDataSetChanged() ". Salva riferimento MyAdapter e chiama myAdapterRef.myNotifyDataSetChanged() invece di myRecyiclerView.getAdapter(). NotifyDataSetChanged().Non so perché ha funzionato per me (ho avuto quel problema con ListView) – bajicdusko

+0

@helionprime Non ha aiutato :( – David

+0

ok, il mio male. Ho dimenticato di ottenere/utilizzare i dati aggiornati all'interno del metodo 'onBindViewHolder'. Ma per quanto riguarda il effetto lampeggio, come posso liberarmene? – David

risposta

17

Se il tuo getItemCount() restituisce 0, quindi notifyDataSetChanged() non farà nulla. Assicurarsi che quando si inizializza l'adattatore, si passi un set di dati valido.

4

In base ai javadocs: se si sta scrivendo un adattatore, sarà sempre più efficiente utilizzare gli eventi di modifica più specifici, se possibile. Affidatevi a notifyDataSetChanged() come ultima risorsa.

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

Sto usando Retrofit per andare a prendere l'elenco, l'onResponse di Retrofit() utilizzare,

adapter.swap(feedList); 
+0

"Secondo javadocs: se stai scrivendo un adattatore sarà sempre più efficiente usare gli eventi di cambiamento più specifici se puoi" dove in javadocs hai trovato queste informazioni? –

+0

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged() –

13

Se notifyDataSetChanged() non si innesca visualizzare gli aggiornamenti di c'è una possibilità che si è dimenticato di chiamare SetLayoutManager() su il tuo RecyclerView (come ho fatto io!). Basta non dimenticare di fare questo:

var manager = new LinearLayoutManager(Context, LinearLayoutManager.Vertical, false); 
_list.SetLayoutManager(manager); 

prima di chiamare SetAdapter();

Ci scusiamo per il codice C#, sto usando Xamarin.

0

Vuoi condividere qualcosa, ero di fronte allo stesso problema. Ma quello che stavo facendo era sbagliato. Stavo creando un'istanza di Adapter ogni volta nuova e non notifysetDatachange() su quella nuova istanza, non su quella precedente.

Quindi, assicurarsi che l'adattatore che si notifysetDatachange() dovrebbe essere più vecchio. Speranza sotto esempio aiuta ..

 MyAdapter mAdapter = new MyAdapter(...) 

    mRecyclerView.setAdapter(mAdapter); 

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


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

    } 

    } 
-4

notifyDataSetChanged() sholud essere chiamato nel thread principale.

+0

Questo non sembra essere il problema – Gabriel

0

Per aggiornare recyclerview possiamo effettuare le seguenti operazioni:

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