转载请注明原创出处,谢谢!
- GitHub: @Ricco
首先我要感谢这篇文章《解决ScrollView嵌套RecyclerView时item显示不全的问题》
还要感谢这篇文章《ScrollView嵌套LinearLayout布局不能撑满全屏的问题》
ps:最近在新项目中遇到了一个问题,一个ScrollView嵌套要嵌套多个RecyclerView。如效果图。当我没开始写的时候就考虑到了Item显示不全和滑动事件的问题。所有我开始查资料解决,虽然很快就解决了,但是踩了一个大坑,所有把他分享给其他正在由此问题的程序员们。
网上很多技术文章给出的方案是用自定义类FullyLinearLayoutManager解决问题,这个方案虽然最后解决了问题,但是滑动流畅度被改变了,像得了老年痴呆一样慢,这是我的App绝对不能忍受的。
幸运的是我又在网上查到了新的解决方案,也就是我开篇感谢的那篇文章,而且这个方案也被很多人使用,但是这个方案被那个像老年痴呆一样慢的文章给否决了,原因是没有完美解决。好玩的是,在我的app中,嵌套问题被完美解决。。。
我知道很多人的懒的点击我推荐的解决方案,使用我就把他拷贝一下,然后加点东西,做个小笔记,记录一下。
作者给出的方案是
在xml布局文件中将ScrollView替换android.support.v4.widget.NestedScrollView,并在java代码中设置recyclerView.setNestedScrollingEnabled(false);属性。
在MD中,RecyclerView代替了ListView,而NestedScrollView代替了ScrollView,就这么简单。Nested就是嵌套的意思。
翻译:NestedScrollView就像ScrollView,但它支持代理。作为一个嵌套的滚动父和子,在新版本和旧版本的Android。默认情况下启用了嵌套滚动。
新的问题:RecyclerView设置空数据View时布局不能撑满全屏
当解决了嵌套问题后,在给RecyclerView设置数据的时候,结果又出现了一个小问题,当RecyclerView设置的数据存在空白的情况时,需要显示EmptyView时,发现EmptyView不能填充满RecyclerView,这时候设置“fill_parent”或者“match_parent”是不管用的,因为当NestedScrollView没有设置fillVeewport为true时, 里面的元素(比如RecyclerView)会按照wrap_content来计算。(如截图效果)
这时候只需要给NestedScrollView设置 android:fillViewport="true"即可解决问题。(如截图效果)
实例代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
android:fillViewport="true"
android:layout_height="match_parent"
android:layout_width="match_parent">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<其他view>
<android.support.v7.widget.RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
小计
如果只使用NestedScrollView替换了ScrollView,而不在java代码中设置recyclerView.setNestedScrollingEnabled(false);属性。那么你的App滑动流畅度就像得了老年痴呆一样,和自定义FullyLinearLayoutManager解决方案的滑动流畅度有的一拼。