LinearLayout和RecyclerView不会一起滚动

时间:2017-02-13 20:46:53

标签: android android-layout xamarin.android

我已经浏览过很多帖子,但无法获得我需要的帖子。我有一个带有RecyclerView的LinearLayout,我想要两个都滚动。现在,LinearLayout已修复,RecyclerView是唯一滚动的。我尝试使用nestedscrollview但无法使其工作。出于某种原因,recyclerview.adapter使用nestedscrollview中断。任何的想法? 顺便说一下:我正在开发Xamarin Android

这是我的布局

<LinearLayout 
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent">
         ...
    </LinearLayout>
    <FrameLayout
       android:id="@+id/navigation"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />
</LinearLayout>

然后我在framelayout中加载一个片段,布局是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
    android:id="@+id/spinner"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" />
<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/refresher"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:scrollbars="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
<TextView
    android:id="@+id/empty_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

LinearLayouts本身不会滚动,它们只是为了轻松地以线性方式一个接一个地组织一个视图。如果你想让它滚动,你需要将它嵌套在ScrollView中。

考虑到你想要完成的任务,我不知道在ScrollView中嵌套RecyclerView会起作用。 (我还没有证实这一点)

您使用LinearLayout寻找的行为是什么?它应该包含页眉和页脚?如果是这样,您可以通过为RecyclerView创建唯一的ViewHolders(即一个用于标题,一个用于页脚,第三个用于常规内容)来提供更好的服务。然后您的适配器根据其索引确定要显示的ViewHolder类型。 (例如0 - &gt;标题,n + 2 - &gt;页脚,1:n-1 - &gt;内容(偏移1))

如果您只是在寻找静态标题(即不会与其他内容一起滚动的标题,那么您可以轻松实现这一目标:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="5">

    <!-- Replace this with your header view -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Your Header" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4" >

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/refresher"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:scrollbars="vertical"
                android:layout_width="match_parent"
                android:layout_height="fill_parent" />
        </android.support.v4.widget.SwipeRefreshLayout>

        <ProgressBar
            android:id="@+id/spinner"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />
    </RelativeLayout>
</LinearLayout>

这将为您提供一个标题视图,该视图占据包含视图总高度的1/5。 RecyclerView(包括其包含视图和进度条)位于视图中,该视图将包含包含视图总高度的剩余4/5。

答案 1 :(得分:0)

如果我对您的理解正确,则需要滚动RecyclerView的内容以及也放置在LinearLayout中的周围视图,就像它们只是在一个滚动容器中一样。

要解决此问题,可以使用NestedScrollLayout。 这样您的布局将类似于此:

<NestedScrollLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ProgressBar
            android:id="@+id/spinner"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/refresher"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
                android:scrollbars="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" />

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

        <TextView
            android:id="@+id/empty_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

</NestedScrollLayout>

现在,您可以通过在代码中插入一行来实现目标:

ViewCompat.setNestedScrollingEnabled(listRecyclerView, false);

在将RecyclerViewAdapter附加到RecyclerView之后,必须添加此行。 滚动后的行为应该像您想要的那样。

您可以在此处重新阅读此解决方案:https://wajahatkarim.com/2018/05/recyclerview-scrolling-issue-with-nestedscrollview/

我采用他的方式解决了您的问题,因为作者对他的方法进行了更为概括的描述。

我希望这会对您和其他遇到此问题的人有所帮助。

编辑:不幸的是,这种方法有两个缺点,我刚遇到。

首先,它会禁用RecyclerView的滚动,因此设置在RecyclerView上的任何ScrollListener将不再触发。

第二,当您将setNestedScrollingEnabled放入false时,再也没有RecyclerView的好处了。您的RecyclerView无法在此设置中使用回收功能。这意味着,列表中的所有项目将直接在开始时呈现。如果列表中有很多项目,这可能会导致您的应用程序运行不佳,因为它需要更长的时间来布局所有内容,并且需要更多的内存。