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.
- Desactivación del comportamiento de desplazamiento de Android CoordinatorLayout
- Cómo eliminar el espaciado Horizontal GridLayoutManager recyclerview android
- Descargando la imagen del almacenamiento de firebase usando picasso: excepción de memoria
- Cómo obtener un contexto en un adaptador de vista de reciclador
- Deslice RecyclerVista arriba mientras lo desliza hacia arriba, o deslice la vista de reciclaje hacia abajo mientras desliza hacia abajo
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.
- Buscar a través de RecyclerView usando Searchview
- RecyclerView onclick se activa antes de que la animación del clic se complete
- Recyclerview se bloquea al eliminar el último elemento. NullPointerException: android.view.ViewGroup $ LayoutParams android.view.View.getLayoutParams ()
- Cómo persistir grandes datos RecyclerView en los cambios de orientación?
- Recyclerview exterior no recibe eventos de desplazamiento de Recyclerview interno
- Animar bot / parte inferior de la vista viola desplazamiento en recyclerView
- RecyclerView dentro de CoordinatorLayout, AppBarLayout Asunto de desplazamiento
- Eliminación del indicador de foco de RecycleView en Android
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