NestedScrollView 在内容改变时滚动到顶部

NestedScrollView scrolls on top when content changes

我有一个 fragment_layout.xml,它有两个按钮(filter_1_btnfilter_2_btn),用于过滤 RecyclerView 的项目。问题是,当我滚动一点(因为按钮上方的 TextView 包含多行文本)然后应用过滤时,NestedScrollView 会在屏幕顶部滚动。有没有办法在过滤后保持相同的滚动高度?

fragment_layout

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nested_scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical">

        <TextView
            android:id="@+id/description_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="36dp"
            android:text="Very long random text..." />

        <Button
            android:id="@+id/filter_1_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Filter 1"/>

        <Button
            android:id="@+id/filter_2_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Filter 2"/>

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="24dp" />

    </LinearLayout>

</androidx.core.widget.NestedScrollView>


这是因为 recyclerView 的容器设置为 wrap_content ,所以当高度小于 NestedScrollView 时,它会滚动到顶部。

您可以通过提供大于 NestedScrollView 的高度来修复它:

所以添加最小高度:

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nested_scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:descendantFocusability="blocksDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical">
        <TextView
            android:id="@+id/description_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="36dp"
            android:text="Very long random text..." />
        <Button
            android:id="@+id/filter_1_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Filter 1" />
        <Button
            android:id="@+id/filter_2_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Filter 2" />
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="1000dp">
           <!-- Add min height to support scrolling-->
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/list"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="24dp" />
        </FrameLayout>
    </LinearLayout>
</androidx.core.widget.NestedScrollView>