Tengo un padre recyclerview que tiene 3 niños de la vista en ella. Los dos últimos de que el niño se recyclerview.

Parent recyclerview
 - child view 1
 - child view 2 (horizontal rv)
 - child view 3 (horizontal rv)

El problema es que cada vez que este fragmento es visible, que se desplaza a sí mismo para alinear con child view 2‘s de la parte inferior.

He puesto el padre de rv para escuchar de desplazamiento. Esto es lo que terminan con:

dy: 108
dy: 72
dy: 75
dy: 62
dy: 48
dy: 42
dy: 34
dy: 27
dy: 22
dy: 16
dy: 12
dy: 10
dy: 7
dy: 5
dy: 3
dy: 3
dy: 1
dy: 1
dy: 1

Parece que la partida dy de los padres recyclerview se establece en 0 a la child view 2 rv. Todo lo anterior es que en cinco de valor. Sin embargo, no estoy seguro de si este era el caso, ya que todavía estoy descubriendo cuál es su causa.

Alguna solución?

InformationsquelleAutor Emen | 2016-08-15

6 Comentarios

  1. 134

    Tenemos un problema similar. Tenemos una vertical RecyclerView. Cada elemento de esta vertical RecyclerView contiene una horizontal RecyclerView, como en el Android TV app.

    Cuando hemos actualizado el apoyo libs de 23.4.0 a 24.0.0 el desplazamiento automático de repente apareció. En particular, cuando abrimos un Activity y a continuación, volver, la vertical RecyclerView se desplaza hacia arriba de modo que la corriente horizontal RecyclerView fila no se cortan y la fila se muestra completamente.

    Hay una solución fácil. Agregue esto a su exterior/padre RecyclerView:

    android:descendantFocusability="blocksDescendants"

    La solución la he encontrado en esta pregunta:

    Además, he encontrado otra solución, que también funciona. En nuestro caso la vertical RecyclerView se encuentra dentro de un FrameLayout. Si puedo añadir android:focusableInTouchMode="true" a este FrameLayout, el problema desaparece.

    Por cierto, también hay un tema abierto en el AOSP.

    • Trabajó sólo en cuestión de segundos..
    • Para ser claros, debes agregar esto a los padres de la RecyclerView que se desplaza de forma automática.
    • Yo nunca habría descubierto esto.
    • curiosamente sucedió para mí, sólo en la liberación de versiones, versión de depuración estaba bien
    • Eso es útil. Muchas gracias!
    • Para mí la adición de android:focusableInTouchMode="true" a la NestedScrollView que es el padre de la RecyclerView se ha solucionado el problema. Cuáles son los efectos secundarios después de la adición de este código?

  2. 3

    Ah, he estado luchando para solucionarlo. La solución es muy simple en realidad. Como una referencia para mí (y a cualquier otra persona que se enfrenta el mismo problema en el futuro), sólo tengo que setFocusable() en el niño la vista de la rv para false, y no se enfoca a la vista más cuando el fragmento es visible.

    En mi caso, tengo que establecer mediante programación una vez que los datos se han cargado de un API.

    • Esto lo ha resuelto. Gracias. Usted sólo tiene que asegurarse de que si la raíz recyclerview instancias son las que debe estar marcado con seleccionable como falsa.
  3. 3

    Después de una larga búsqueda llegué a mis ojos en el parámetro reverseLayout que se establece en true. He sustituido

    horizontalRV.setLayoutManager(
        new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, true));

    con

    horizontalRV.setLayoutManager(
        new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
  4. 0

    Sugerencia corta a @albertvilacalvo respuesta:
    Si utiliza RecyclerView mediante programación, puede manejar setFocusableInTouchMode de esa manera (incluir en su RecyclerView clase)

    @Override
    protected void onAttachedToWindow() {
       ((View) getParent()).setFocusableInTouchMode(true);
       super.onAttachedToWindow();
    }

    La descendantFocusability solución falla si usted necesita EditText en su hijo puntos de vista, que no obtendría el cursor más. Estoy usando ListView personalizado (multi)toque y EditText en mi RecyclerView childs. No hay efectos colaterales uso de setFocusableInTouchMode hasta ahora.

  5. 0

    Inicializar el administrador de diseño en oncreate sólo o solo 1 vez no vuelva a inicializar
    recyclerview.setLayoutManager(nueva LinearLayoutManager(contexto));

Dejar respuesta

Please enter your comment!
Please enter your name here