recyclerview - com.android.support:design 26
RecyclerView notifyDataSetChanged se desplaza a la posiciĆ³n superior (6)
cuando se llama a notifyDataSetChanged
en RecyclerView
, no retiene la posición de desplazamiento y se desplaza hacia arriba, ¿hay alguna solución para mantener su posición de desplazamiento?
Puede usar swapAdapter () y después de invocar notifyDataSetChange () . Esto funciona para mí
No estoy seguro de si esto resuelve su problema, pero estaba teniendo el mismo problema y fue porque estaba llamando a setAdapter después de notificarlo. Entonces, no llamar a setAdapter después de notificar solucionó el 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.
Si su elemento de la lista RecyclerView padre tiene la propiedad "wrap_content", Recyclerview calcula las alturas nuevamente y se desplaza hacia arriba.
Hay dos soluciones:
- Establezca su altura en un valor constante como este:
layout_height="100dp"
Use StaggeredLridLayoutManager como este:
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));
si desea cambiar elementos con animaciones, use el método notifyItemChanged en Fragment o Activity. No en la clase de Adaptador:
mRecyclerView.getAdapter().notifyItemChanged(position);
La segunda solución es más eficiente y sugiero esta
RecycleViews se desplazará de nuevo a la parte superior en cualquier variante de notifyDataSetChanged
si no tienen un administrador de diseño. Aquí hay un ejemplo de cómo establecer uno.
recycleView.setLayoutManager(new LinearLayoutManager(context, OrientationHelper.VERTICAL, false));
Como supongo, lo que está haciendo es restablecer el adaptador a RecyclerView
y luego llamar a notifyDataSetChanged().
Solo debe pasar la dataList
de dataList
al adaptador pasando dataList
en el método del adaptador como la update(dataList)
adaptador update(dataList)
. Y en este método puede asignar esta lista a la lista de adaptadores;
public void update(ArrayList<Hashmap<String,String> list){
this.mList = list;
}
Puede conservar la posición guardándola antes de notifyDataSetChanged y luego llamar al desplazamiento suave a la posición guardada
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);