嵌套的recyclerviews在nestedscrollview中

时间:2018-02-22 06:38:19

标签: android android-recyclerview

我正在尝试实现嵌套的RecyclerView。我这样做但父卷轴RecyclerView滚动不顺畅。我做了很多优化,但仍然无法成功使用滚动,直到我将父回收视图放在NestedScrollView中。滚动现在完美无缺,但我有一个问题。

如果我滚动(甚至是微小的)我的内心RecyclerView(水平),我立即回到[垂直recyclerview - parent] 的开头。

这种情况发生过一次。为什么这样,是否有可能解决它?

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/parent_rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </android.support.v7.widget.RecyclerView>

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

2 个答案:

答案 0 :(得分:0)

据我了解您的问题,您的父级RecyclerView会更新并在内部水平RecyclerView项目更新时滚动到位置0。您还声明水平RecyclerView停留在同一位置更新项目已更新。在这种情况下,您需要保存父RecyclerView的状态,然后将其放回水平RecyclerView中的项目更新后的位置。

// Save state
private Parcelable recyclerViewState;
recyclerViewState = parentRecyclerView.getLayoutManager().onSaveInstanceState();

// Restore state
parentRecyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);

在调用API以更新水平RecyclerView中的数据之前保存状态,然后在更新完成时恢复父RecyclerView的位置。

答案 1 :(得分:0)

我有一个解决方案。 基本上,我所做的是在相对布局中包装回收器视图并设置android:descendantFocusability="blocksDescendants",现在它运行良好。

<android.support.v4.widget.NestedScrollView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:descendantFocusability="blocksDescendants">

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/parent_rv"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

        </RelativeLayout>

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