viewholder recyclerview from android scroll android-recyclerview

android get viewholder from recyclerview



¿Cómo guardar la posición de desplazamiento de RecyclerView en Android? (6)

Tengo la vista Recycler que se encuentra dentro de SwipeRefreshLayout. Además, tiene la capacidad de abrir cada elemento en otra actividad. Después de volver a Recycler, necesito desplazarme al elemento seleccionado o a la Y anterior. ¿Cómo hacerlo?

Sí, busqué en Google, encontré artículos en StackOverFlow sobre cómo guardar una instancia del administrador de diseño, como esta: RecyclerView almacenar / restaurar el estado entre las actividades . Pero, eso no me ayuda.

ACTUALIZAR

En este momento tengo este tipo de problema de resolución, pero, por supuesto, tampoco funciona.

private int scrollPosition; ...//onViewCreated - it is fragment recyclerView.setHasFixedSize(true); LinearLayoutManager llm = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(llm); data = new ArrayList<>(); adapter.setData(getActivity(), data); recyclerView.setAdapter(adapter); ... @Override public void onResume() { super.onResume(); recyclerView.setScrollY(scrollPosition); } @Override public void onPause() { super.onPause(); scrollPosition = recyclerView.getScrollY(); }

Sí, he intentado scrollTo (int, int) - no funciona.

Ahora intenté simplemente desplazarme, por ejemplo, a Y = 100, pero no se desplaza en absoluto.


Guarde el estado actual de la posición de la vista de reciclaje @enPause:

positionIndex= llManager.findFirstVisibleItemPosition(); View startView = rv.getChildAt(0); topView = (startView == null) ? 0 : (startView.getTop() - rv.getPaddingTop());

Restaura la posición de desplazamiento @onResume:

if (positionIndex!= -1) { llManager.scrollToPositionWithOffset(positionIndex, topView); }

u otra forma puede ser @onPause:

long currentVisiblePosition = 0; currentVisiblePosition = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition();

restaurar @onResume:

((LinearLayoutManager) rv.getLayoutManager()).scrollToPosition(currentVisiblePosition); currentVisiblePosition = 0;


Muchas de estas respuestas parecen estar complicándolas.

El LayoutManager admite onRestoreInstanceState fuera de la caja, por lo que no es necesario guardar las posiciones de desplazamiento, etc. El método incorporado ya guarda las posiciones de píxeles perfectos.

código de fragmento de ejemplo (comprobación nula, etc. eliminado por claridad):

private Parcelable listState; private RecyclerView list; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); listState=savedInstanceState.getParcelable("ListState"); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("ListState", list.getLayoutManager().onSaveInstanceState()); }

entonces solo llama

list.getLayoutManager().onRestoreInstanceState(listState);

una vez que sus datos se hayan vuelto a adjuntar a su RecyclerView


Por alguna razón, hay muchos consejos / sugerencias bastante engañosas sobre cómo guardar y restaurar la posición de desplazamiento en su_scrolling_container después de los cambios de orientación.

Tomando la posición de desplazamiento actual y guardándola en Activity''sSaveInstanceState Extendiendo una vista desplazable determinada para que haga lo mismo allí Evitando que la actividad se destruya en la rotación Y sí, están funcionando bien, pero ...

Pero, de hecho, todo es mucho más simple, ¡porque Android ya lo está haciendo por ti!

Si observa más detenidamente las fuentes RecyclerView / ListView / ScrollView / NestedScrollView, verá que cada una de ellas guarda su posición de desplazamiento en onSaveInstanceState. Y durante el primer paso de diseño, intentan desplazarse a esta posición en el método onLayout.

Solo hay 2 cosas que debes hacer para asegurarte de que funcionará bien:

  1. Establezca una identificación para su vista desplazable, que probablemente ya está hecha. De lo contrario, Android no podrá guardar el estado de Vista automáticamente.

  2. Proporcione datos antes del primer paso de diseño, para tener los mismos límites de desplazamiento que tenía antes de la rotación. Ese es el paso donde los desarrolladores suelen tener algunos problemas.



Use su reciclador para ver linearlayoutmanager para obtener la posición de desplazamiento

int position = 0; if (linearLayoutManager != null) { scrollPosition = inearLayoutManager.findFirstVisibleItemPosition(); }

y cuando se restaura el uso siguiente código

if (linearLayoutManager != null) { cardRecyclerView.scrollToPosition(mScrollPosition); }

Espero que esto te ayude


para guardar la posición en Preferencias, agregue esto a su onStop ()

int currentVisiblePosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); getPreferences(MODE_PRIVATE).edit().putInt("listPosition", currentVisiblePosition).apply();

luego restaurar posición como esta

if (getItemCount() == 0) { int savedListPosition = getPreferences(MODE_PRIVATE).getInt("listPosition", 0); recyclerView.getLayoutManager().scrollToPosition(savedListPosition); }

este último código debe agregarse dentro de un evento del Adaptador (no estoy seguro de que el evento de bruja, pero en mi caso fue onEvent () - com.google.firebase.firestore.EventListener)