2015-03-11 13 views
8

quando chiama notifyDataSetChanged su RecyclerView non mantiene la posizione di scorrimento e scorre verso l'alto, c'è qualche soluzione per mantenere la posizione di scorrimento?RecyclerView notifyDataSetChanged scorre nella posizione superiore

+0

Hai trovato qualche soluzione? –

+1

** NON chiamare ** 'notifyDataSetChanged()' su 'RecyclerView'. Usa i nuovi metodi come 'notifyItemChanged()', 'notifyItemRangeChanged()', 'notifyItemInserted()', ecc ... –

+1

Ho provato notifyItemRangeInserted(), ma anche quello scorre verso l'alto. Qualche idea? –

risposta

3

Non sono sicuro se questo risolve il problema, ma stavo avendo lo stesso problema ed era perché stavo chiamando setAdapter dopo la notifica. Quindi, non chiamare setAdapter dopo la notifica ha risolto il problema.

mAdapter.notifyItemRangeInserted(mAdapter.getItemCount(), list.size() - 1); 
recyclerView.setAdapter(); // remove this line. 
//Do this only when you're setting the data for the first time or when adapter is null. 
+0

Grazie, è lavoro –

8

Se l'elemento della lista RecyclerView genitore ha proprietà "wrap_content", Recyclerview calcola le altezze di nuovo e scorre in alto.

ci sono due soluzioni:

  1. impostare l'altezza di un valore costante come questa: layout_height="100dp"
  2. Usa StaggeredGridLayoutManager come questo:

    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));

se si desidera cambia elementi con animazioni, usa il metodo notifyItemChanged in Fragm ent o Attività. Non in classe Adapter:

mRecyclerView.getAdapter().notifyItemChanged(position); 

La seconda soluzione è più efficiente e vi suggerisco questo uno

+0

Sì, la vista Recycler calcola l'altezza in caso di "wrap_content", quindi la correzione sta impostando l'altezza del layout fissa o l'altezza su "match_parent". – anp8850

1

RecycleViews scorreranno torna su qualsiasi variante di notifyDataSetChanged se non hanno un gestore di layout. Ecco un esempio di come impostarne uno.

recycleView.setLayoutManager(new LinearLayoutManager(context, OrientationHelper.VERTICAL, false)); 
0

Come sto indovinando, quello che stai facendo è resettare l'adattatore al RecyclerView e quindi chiamando notifyDataSetChanged().

È necessario passare solo la dataList all'adattatore passando dataList nel metodo adattatore come adattatore update(dataList) . E in questo metodo è possibile assegnare questo elenco alla lista degli adattatori come;

public void update(ArrayList<Hashmap<String,String> list){ 
    this.mList = list; 
} 
0

si può mantenere la posizione, salvando prima notifyDataSetChanged e quindi chiamare scorrere liscia per posizione salvata

final int currentVisibleItem = ((LinearLayoutManager) layourmanager).findFirstCompletelyVisibleItemPosition(); 
          productListAdapter.notifyDataSetChanged(); 
          Handler handler = new Handler(); 
          handler.postDelayed(new Runnable() { 
           @Override 
           public void run() { 

        if(currentVisibleItem>-1 && currentVisibleItem<lstProducts.size()) 
            rv_products.scrollToPosition(currentVisibleItem); 
           } 
          }, 100); 
Problemi correlati