RecycleView крадет фокус, когда внутри NestedScrollView

Когда я помещаю 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); } } 

В этом примере у меня есть 350dp высокий пустой вид на recycleview, потому что для этого нужно иметь некоторый контент над RecycleView. RecycleView itestelf содержит 100 фиктивных текстовых просмотров.

После того, как вы начнете действие, прокрутка находится вверху RecycleView, а не вверху страницы. Это должно быть что-то внутри LinearLayoutManager, но havent действительно выглядел еще.

Есть идеи, как это решить?

Сделайте свой обзор более привлекательным. «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)