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 .

  • No se puede llamar a void android.view.View.setTranslationZ (float) en un objeto null
  • Android Horizontal Recycler Ver desplazamiento Dirección
  • RecyclerView onclick se activa antes de que la animación del clic se complete
  • Smooth desplazamiento recyclerview android
  • Persistente hoja inferior con vista recicladora
  • Espresso Nested Recycler Vistas Prueba de interfaz de usuario
  • Cómo eliminar el espaciado Horizontal GridLayoutManager recyclerview android
  • Desactivación del comportamiento de desplazamiento de Android CoordinatorLayout
  • Force RecyclerView para volver a dibujar Android
  • Cómo persistir grandes datos RecyclerView en los cambios de orientación?
  • RecyclerView eliminar el bug de animación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.