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?
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>
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"
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>
Mach es so:
LinearLayoutManager lm = new LinearLayoutManager(this);
lm.setAutoMeasureEnabled(true);
view.setLayoutManager(lm)