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: Introduzca aquí la descripción de la imagen

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.

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.

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 .

  • ¿Las mejores prácticas para usar el reino con una vista de reciclador?
  • Force RecyclerView para volver a dibujar Android
  • Cómo mostrar la fecha entre conversación en recyclerview o en listview
  • Cargando diferentes imágenes fuera de línea (imágenes predeterminadas) en NetworkImageview Volley android
  • Definición de onclickListener de RecyclerView en una actividad
  • Espresso Nested Recycler Vistas Prueba de interfaz de usuario
  • RecyclerView sin barra de desplazamiento cuando se desactiva el desplazamiento excesivo
  • RecyclerView se bloquea al desplazarse
  • No hay buen ejemplo sobre RecyclerView y StaggeredGridLayoutManager en Documentos de Android
  • RecyclerView - Desplácese hasta la posición de no trabajar cada vez
  • El rollo no funciona correctamente para RecyclerView dentro de CoordinatorLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.