51 votes

RecycleView vole le focus lorsque vous vous trouvez dans un NestedScrollView

Quand je mets un RecycleView imbriquée à l'intérieur d'un scrollview, l'écran saute toujours en haut de la recycleview au lieu de la haut de la page. Voici un exemple simple.

mise en page 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>

Activité avec des feintes de l'adaptateur:

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);
}

}

Dans cet exemple j'ai un 350dp grand vide, vue sur la recycleview parce que vous avez besoin d'avoir un peu de contenu sur le RecycleView pour montrer jusqu'évidemment. Le RecycleView iteself contient 100 factice textviews.

Après le démarrage de l'activité, le rouleau est en haut de la RecycleView au lieu de la haut de la page. Il doit être quelque chose à l'intérieur de la LinearLayoutManager, mais nai pas vraiment regardé encore.

Toute idée comment résoudre ce problème?

147voto

Amagi82 Points 5221

Faites votre vue de dessus focusable. "RecyclableView a" focusableOnTouchMode "défini sur true pour gérer les modifications apportées à la focalisation de ses enfants lors de la mise en page." Discussion pertinente sur la question .

Exemple:

 <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>
 

34voto

dr-to-str Points 171

Pour moi, la réponse acceptée ne fonctionnait pas. Je résous ce problème en ajoutant cet attribut pour parent:

android:descendantFocusability="blocksDescendants"

5voto

André Luiz Reis Points 1150

Merci @ Amagi82. Vous avez répondu m'a aidé mais ce n'était pas suffisant. J'ai ajouté plus 2 attributs. Cela a fonctionné pour moi:

 <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>
 

1voto

Chris Sherlock Points 556

Faites-le de cette façon:

 LinearLayoutManager lm = new LinearLayoutManager(this);
lm.setAutoMeasureEnabled(true);
view.setLayoutManager(lm)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X