在NestedScrollView中时,RecycleView窃取焦点

当我把一个RecycleView放在一个嵌套的scrollview中时,屏幕总是跳转到recycleview的顶部,而不是页面的顶部。 这是一个简单的例子。

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

虚拟适配器的活动:

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

在这个例子中,我在recycleview上有一个高达350dp的空白视图,因为你需要在RecycleView上有一些内容来显示。 RecycleView iteself包含100个虚拟文本视图。

在开始活动后,滚动位于RecycleView的顶部,而不是页面的顶部。 它必须是LinearLayoutManager内的东西,但还没有真正看过。

任何想法如何解决这个问题?

Solutions Collecting From Web of "在NestedScrollView中时,RecycleView窃取焦点"

使您的顶视图可以聚焦。 “RecyclerView将”focusableOnTouchMode“设置为true,以在布局过程中处理孩子的焦点变化。” 有关这个问题的讨论 。

例:

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

对于我接受的答案没有工作。 我通过为父项添加此属性来解决此问题:

android:descendantFocusability="blocksDescendants"

这样做:

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

谢谢@ Amagi82。 你回答帮助我,但这还不够。 我添加了更多2个属性。 这对我有用:

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