Desplazamiento del foco de RecyclerView
Tengo un RecyclerView con generalmente dos columnas y hasta ocho. Utilizamos una gran cantidad de navegación D-PAD. Tenemos un problema al desplazarse, el elemento enfocado saltará de izquierda a derecha. Ver fotos:
Me di cuenta de que si los elementos que vienen a continuación se almacenan en caché, no hay ningún problema de enfoque al desplazarse. Otro problema que tengo es mi tema de enfoque puede aparecer debajo de mi encabezado pegajoso. Esto no es deseado. Así que me siento como si lo hice así que cuando el desplazamiento que tendría una especie de "umbral". De esta manera, cuando el enfoque está dentro de un elemento de estar fuera de la pantalla, se desplazará. De esta manera, el enfoque nunca está en el fondo, o en la parte superior.
- Deslice RecyclerVista arriba mientras lo desliza hacia arriba, o deslice la vista de reciclaje hacia abajo mientras desliza hacia abajo
- RecyclerView desplazamiento sobre inserto
- Arrastrar y soltar entre dos RecyclerView
- Cómo hacer que RecyclerView se desplace sin problemas?
- RecyclerView se bloquea al desplazarse
Con eso en mente, he intentado este enfoque sin suerte:
RecyclerView rv; @Override public void onFocusChange(View v, boolean hasFocus) { if(!v.hasFocus()) { Log.w(TAG, "View v did not have focus"); return; } final int index = rv.getChildPosition(v); //adapter pos if(index == NO_POSITION) { Log.w(TAG, "Recycler view did not have view"); return; } int position = rv.indexOfChild(v); // layout pos int lastPos = rv.getChildCount(); // layout pos int span = getLayoutManager().getSpanCount(); int threshold = 2 * span; Log.d(TAG, String.format("Position: %1$d. lastPos: %2$d. span: %3$d. threshold: %4$d", position, lastPos, span, threshold)); if (position >= (lastPos - threshold)) { //scroll down if possible int bottomIndex = rv.getChildPosition(rv.getChildAt(lastPos)); if (bottomIndex < getItemCount()) { //scroll down int scrollBy = v.getHeight(); recycler.scrollBy(0, scrollBy); Log.d(TAG, String.format("Scrolling down by %d", scrollBy)); } } else if (position <= threshold) { //scroll up if possible int topIndex = rv.getChildPosition(rv.getChildAt(0)); if (topIndex > 0) { //scroll up int scrollBy = v.getHeight(); recycler.scrollBy(0, -scrollBy); Log.d(TAG, String.format("Scrolling up by %d", -scrollBy)); } } }
Estoy abierto a cualquier idea sobre cómo manejar el enfoque al desplazarse.
- Java.lang.IllegalStateException: Objeto ya no es administrado por Realm. ¿Se ha eliminado?
- Eliminación del indicador de foco de RecycleView en Android
- Detener elementos de moverse cuando se utiliza StaggeredGridLayoutManager
- Recyclerview se bloquea al eliminar el último elemento. NullPointerException: android.view.ViewGroup $ LayoutParams android.view.View.getLayoutParams ()
- Efecto de ondulación sobre un elemento de RecyclerView que contiene ImageView
- NestedScrollView y Horizontal RecyclerView Smooth Scrolling
- El rollo no funciona correctamente para RecyclerView dentro de CoordinatorLayout
- RecyclerView dentro de CoordinatorLayout, AppBarLayout Asunto de desplazamiento
Informé de este error a AOSP problema de rastreo: número 190526
Como puedo ver desde el origen, el problema se debe a que GridLayoutManager
utiliza la implementación de onFocusSearchFailed()
de onFocusSearchFailed()
que se llama cuando el enfoque se aproxima al borde interno de RecyclerView
. La implementación de LinearLayoutManager
sólo ofrece el primer / último elemento (depende de la dirección de desplazamiento). Por lo tanto el enfoque se sitúa en el primer / último elemento de la nueva fila.
Mi solución para este problema .
- ¿Cómo utilizo la nueva biblioteca de enlace de datos de Android para poblar a los hijos de un LinearLayout basado en una colección?
- Evitar las llamadas de método indirecto y redundante