вложенный вид прокрутки + просмотр повторного использования, странное поведение автопрокрутки

В пейджере представления у меня есть несколько фрагментов, один из них использует вложенную прокрутку с заголовком и recyclerview:

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scrollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.m360.android.fragment.Members.MemberDetailsFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingTop="20dp">

        <header/>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            android:paddingTop="0dp" />

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

Тег «заголовок» представляет собой сложный макет, который я не хотел публиковать здесь, так как он сильно растягивает код.

когда я переключаюсь между вкладками, он прокручивается прямо до вида ресайклера. Заголовок скрыт, мне нужно прокрутить вверх, чтобы увидеть его.

Любые идеи о том, что вызывает это? Я не хочу использовать тип в своем адаптере, если я могу этого избежать.


person Renaud Favier    schedule 22.06.2016    source источник


Ответы (2)


У нас похожая проблема. У нас есть вертикаль RecyclerView. Каждый элемент этой вертикальной RecyclerView содержит горизонтальную RecyclerView, как в приложении Android TV.

Когда мы обновили библиотеки поддержки с 23.4.0 до 24.0.0, внезапно появилась автоматическая прокрутка. В частности, когда мы открываем Activity, а затем возвращаемся назад, вертикальная RecyclerView прокручивается вверх, так что текущая горизонтальная RecyclerView строка не обрезается, а строка отображается полностью.

Добавление android:descendantFocusability="blocksDescendants" устраняет проблему.

Однако я нашел другое решение, которое также работает. В нашем случае вертикаль RecyclerView содержится внутри FrameLayout. Если я добавлю android:focusableInTouchMode="true" к этому FrameLayout, проблема исчезнет.

Здесь даже упоминается третье решение, которое в основном состоит в вызове setFocusable(false) для дочернего/внутреннего RecyclerViews. Я не пробовал это.

Кстати, есть открытая проблема с AOSP.

person Albert Vila Calvo    schedule 08.11.2016
comment
Вы выбрали второе решение? почему вы думаете, что это лучше? спасибо - person Renaud Favier; 08.11.2016
comment
@RenaudFavier Я выбрал вариант android:descendantFocusability="blocksDescendants". Я думаю, что 3 представленных решения делают что-то похожее (в основном не позволяют дочернему/внутреннему RecyclerView получить фокус, что предотвращает автопрокрутку). Однако взгляните на это, чтобы лучше понять проблема. - person Albert Vila Calvo; 08.11.2016
comment
@RenaudFavier Я могу использовать трюк android:focusableInTouchMode="true", чтобы украсть фокус, потому что мой внешний RecyclerView завернут внутрь FrameLayout. Я не уверен, что вы можете это сделать, если внешний RecyclerView является корнем вашего макета. - person Albert Vila Calvo; 08.11.2016
comment
Да я вижу. Спасибо, что поделились ! - person Renaud Favier; 08.11.2016
comment
Хорошо, это решило мою проблему. Но ПОЧЕМУ это помогло, я не понимаю. Если бы кто-нибудь объяснил. Спасибо! - person Felipe Castilhos; 19.02.2018

setandroid:focusableInTouchMode="true" для дочернего макета (может быть LinearLayout) из NestedScrollView

person Balu Sangem    schedule 07.12.2017
comment
Спасибо, чувак. ты спас мой день. - person Ali Khoshraftar; 14.09.2020