Cuando pongo un RecyclerView dentro de un entramado scrollview, la pantalla siempre salta a la parte superior de la RecyclerView en lugar de la parte superior de la página. Aquí está un ejemplo sencillo.

layout xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="350dp"
            android:background="@android:color/holo_blue_dark"/>
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycleView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>
</layout>

Actividad con un maniquí adaptador:

public class RecycleViewTestActivity extends AppCompatActivity {

public static class ExampleAdapter extends RecyclerView.Adapter<ExampleViewHolder> {

    private Context context;

    public ExampleAdapter(Context context) {
        this.context = context;
    }

    @Override
    public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        TextView view = new TextView(context);
        view.setText("Test");
        return new ExampleViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ExampleViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 100;
    }
}

public static class ExampleViewHolder extends RecyclerView.ViewHolder {

    public ExampleViewHolder(View itemView) {
        super(itemView);
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rectest);
    RecyclerView view = (RecyclerView) findViewById(R.id.recycleView);
    view.setNestedScrollingEnabled(false);
    view.setLayoutManager(new LinearLayoutManager(this));
    ExampleAdapter adapter = new ExampleAdapter(this);
    view.setAdapter(adapter);
}

}

En este ejemplo tengo un 350dp de alto vacío vista sobre el recycleview porque usted necesita tener algo de contenido a través de la RecycleView para que esto se muestran obviamente. El RecycleView iteself contiene 100 ficticio textviews.

Después de iniciar la actividad, el desplazamiento es en la parte superior de la RecycleView en lugar de la parte superior de la página. Debe ser algo en el interior de la LinearLayoutManager, pero realmente no ha visto todavía.

Alguna idea de cómo solucionar esto?

InformationsquelleAutor breakline | 2016-04-28

4 Comentarios

  1. 132

    Hacer que su vista superior seleccionable. «RecyclerView ha «focusableOnTouchMode» se establece en true para manejar sus niños el enfoque de los cambios durante el diseño.» Pertinentes la discusión de la cuestión.

    Ejemplo:

    <android.support.v4.widget.NestedScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:focusableInTouchMode="true"
            android:orientation="vertical">
    
            <View
                android:id="@+id/someView"
                android:layout_width="wrap_content"
                android:layout_height="350dp"/>
    
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
    
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>
    • Gracias, de hecho, esto se soluciona este problema.
    • Que trabajó para mí también. Acabo de poner: android:seleccionable=»true» android:focusableInTouchMode=»true» en cualquier vista de que es el padre de su RecyclerView y que debe resolver.
    • Gracias lottttttt @Amagi82. Usted salvó mi día
    • Gracias, funciona como un encanto
    • Dios bendiga a usted, compañero!
    • A continuación es mi solución android:descendantFocusability=»blocksDescendants» a los padres de recyclerview.
    • gran solución y simple! Gracias
    • <android.apoyo.v4.widget.NestedScrollView Hizo el truco. Gracias!
    • oh hombre que salvó mi día!
    • El trabajo para mí, gracias a salvar mi día
    • Usted salvó mi trabajo !

  2. 26

    Para mí aceptado respuesta no trabajo. Voy a resolver esto mediante la adición de este atributo para los padres:

    android:descendantFocusability="blocksDescendants"

    • a mí me funcionó. Yo estaba usando reciclador de vista en vista de desplazamiento. gracias
    • Yo tenía el mismo diseño que @GulnazGhanchi. Esto funcionó para mí 🙂
    • Genial, esto también funciona al tener Horizontal RecyclerView(s) dentro de un Vertical RecyclerView. El punto de robar el foco cuando los datos se unen y causar la lista para hacer pequeños «saltos» que la disminución de rendimiento. Funciona como un encanto para agregar android:descendantFocusability=»blocksDescendants» a la raíz de los Horizontales ReyclerView diseño.
    • esto funciona para mí, horizontal reciclador de vista en el interior vertical reciclador de vista
    • Esto puede ser un problema si usted desea apoyar a la navegación mediante el teclado en su aplicación
    • Mismo aquí. sólo añadir esta línea trabajó para mí.
    • gracias, esto funciona para el caso de que el RecyclerView han VideoView (SimpleExoPlayerView) como elemento, pero la aceptó no tiene la respuesta.
    • blocksDescendants significa que estamos blokcing enfoque característica de descendiente y no podemos interactuar con EditText etc

  3. 4

    Gracias @Amagi82. Que respuesta me ayudó, pero no fue suficiente. He añadido más de 2 atributos. Que trabajó para mí:

    <android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"">
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:descendantFocusability="blocksDescendants"
        android:orientation="vertical">
    
        <View
            android:id="@+id/someView"
            android:layout_width="wrap_content"
            android:layout_height="350dp"/>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    </LinearLayout>

    • blocksDescendants significa que estamos blokcing enfoque característica de descendiente y no podemos interactuar con EditText etc
  4. 0

    Hacerlo de esta manera:

    LinearLayoutManager lm = new LinearLayoutManager(this);
    lm.setAutoMeasureEnabled(true);
    view.setLayoutManager(lm)
    • Lamentablemente esto no funciona para mí, mismo resultado
    • agregue esto a su recyclerView en XML: aplicación:layout_behavior=»@string/appbar_scrolling_view_behavior»
    • hice este trabajo, o hay anymor Problemas ?
    • No, no trabajo. Reciclador de vista es todavía centrado.

Dejar respuesta

Please enter your comment!
Please enter your name here