web-dev-qa-db-de.com

RecycleView stiehlt den Fokus, wenn er sich in einer NestedScrollView befindet

Wenn ich eine RecyclerView in eine verschachtelte Bildlaufansicht lege, springt der Bildschirm immer an den Anfang der RecyclerView-Ansicht und nicht an den Anfang der Seite. Hier ist ein einfaches Beispiel.

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>

Aktivität mit Dummy-Adapter:

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

}

In diesem Beispiel habe ich eine 350dp große leere Ansicht über die Recyclingansicht, da Sie einige Inhalte über der Recyclingansicht haben müssen, damit dies offensichtlich angezeigt wird. Das RecycleView-Programm enthält 100 Dummy-Textansichten.

Nachdem Sie die Aktivität gestartet haben, befindet sich der Bildlauf oben in RecycleView und nicht oben auf der Seite. Es muss etwas im LinearLayoutManager sein, aber noch nicht wirklich ausgesehen.

Irgendwelche Ideen, wie man das lösen kann? 

39
breakline

Machen Sie Ihre Draufsicht fokussierbar. "RecyclerView hat" focusableInTouchMode "auf" true "gesetzt, um die Fokusänderungen der Kinder während des Layouts zu behandeln." Relevante Diskussion des Themas

Beispiel:

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

Für mich akzeptierte die Antwort nicht. Ich löse das, indem ich dieses Attribut für das übergeordnete Element hinzufüge:

Android:descendantFocusability="blocksDescendants"

21
dr-to-str

Danke @ Amagi82. Ihre Antwort hat mir geholfen, aber es hat nicht gereicht. Ich habe weitere 2 Attribute hinzugefügt. Das hat für mich funktioniert:

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

4

Mach es so:

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