2016-04-08 26 views
14

Esiste un modo per ridisegnare tutti gli elementi di RecyclerView?Forza RecyclerView per ridisegnare Android

Ho alcuni temi (in style.xml) e dopo aver modificato il tema, ho bisogno di ridisegnare lo RecyclerView.

Quindi voglio un metodo che costringerà a richiamare onCreateViewHolder per ogni elemento della scheda.

ho cercato di:

  • chiamata adapter.notifyDataSetChanged ma onCreateViewHolder non si chiama
  • chiamata recyclerView.setVisibility(View.GONE) e poi recyclerView.setVisibility(View.VISIBLE)
  • chiamata recyclerView.invalidate()
  • chiamata recyclerView.setAdapter(null) e poi recyclerView.setAdapter(adapter).
    Funziona bene per il 90% degli articoli. Solo il 90% degli articoli otterrà il nuovo stile, ma alcuni articoli avranno il vecchio stile

Ho detto che lo RecyclerView è collegato a un'attività, non a un frammento.

+0

Assicurati di chiamare notifyDataSetChanged() dal thread dell'interfaccia utente, dovrebbe funzionare. – Nanoc

+0

@Nanoc notifyDataSetChanged force only onBindNewHolder, non onCreate –

+0

Spiacente, non ho familiarizzato con lo schema viewHolder, ma dirò che è necessario adattare il codice per lavorare con esso (o non usarlo). – Nanoc

risposta

10

ho trovato la risposta! Il modo corretto per farlo è:

recyclerView.setAdapter(null); 
recyclerView.setLayoutManager(null); 
recyclerView.setAdapter(myAdapter); 
recyclerView.setLayoutManager(myLayoutManager); 
myAdapter.notifyDataSetChanged(); 

Dopo di che, tutti gli elementi sono sempre il nuovo stile!

+3

funziona, ma l'approccio è sbagliato. –

+3

'adapter.doYourStaff(); recyclerView.setAdapter (adattatore);' Queste 2 righe di codice sono sufficienti! –

+3

recyclerView.setAdapter (adattatore) è abbastanza per me. – Arst

0

Date un'occhiata a questa risposta: https://stackoverflow.com/a/33342314/4142087

Poco, è possibile creare diversi tipi di vista titolari, cambiando tipo di vista costringerà RecyclerView di passare un'altra ViewHolder al onBindViewHolder.

Se si utilizza setTheme, è necessario ricreare tutta l'attività in questo modo: https://stackoverflow.com/a/14367214/4142087

+0

Se questo è il modo in cui viene fatto questo schema di spettatore non sembra il più pulito. – Nanoc

+0

@Nanoc può funzionare, non so –

+0

Attualmente utilizzo 2 ViewHolders, ma non funziona –

3

Se si desidera forzare il ridisegno, è necessario visualizzare il pool di visualizzazione di RecycleView. È possibile utilizzare recyclerView.getRecycledViewPool().clear();

+0

Grazie. Ha funzionato per me. –

5

Le righe sotto di codice ha fatto il trucco per me

recyclerview.swapAdapter(myAdapter,false); 
recyclerview.setLayoutManager(myLayoutManager); 
myAdapter.notifyDataSetChanged(); 
Problemi correlati