support recyclerview last android appcompat android-recyclerview

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?



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:

  1. Establezca su altura en un valor constante como este: layout_height="100dp"
  2. 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);