我已经浏览过很多帖子,但无法获得我需要的帖子。我有一个带有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>
答案 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无法在此设置中使用回收功能。这意味着,列表中的所有项目将直接在开始时呈现。如果列表中有很多项目,这可能会导致您的应用程序运行不佳,因为它需要更长的时间来布局所有内容,并且需要更多的内存。