根据已上线的app里总结出来的实用小技巧
相信大家都遇到过ScrollView
嵌套RecyclerView
或者RecyclerView
嵌套RecyclerView
来使用, 也会遇到一堆奇奇怪怪的问题, 比如滑动卡顿、数据加载不完、数据加载完后没有停留在顶部等问题
今天我们就来写一篇RecyclerView
嵌套版本的解决方案
-
今年六月份的
IO
大会把Kotlin
用做Android
开发的一级语言, 也让这个语言在Android
开发圈子里大火了一把, 所以今天的代码是用Kotlin
来实现(当然还是有Java
版本的). -
由于
Google
公司大力推荐大家使用RecyclerView
来代替ListView
和GridView
等等控件, 现在越来越多的开发者都已经上手了RecyclerView
了. -
也推荐大家赶紧使用
RecyclerView
来代替ListView
等等, 好处太多了也就不提了, 配合github
上的一个开源工程使用简直绝配BaseRecyclerViewAdapterHelper
进入正题, 不多BB了
1. 第一种情况
两层
RecyclerView
嵌套这种需求也是很常见的一个需求了, 下面图片就是列举的一个案例
2.第二种情况
一个页面中有个多个
RecyclerView
时,为了保证数据能完整加载, 一般都是在最外层加上一个ScrollView
, 然而出现的一系列问题, 让人头大, 当然本文章也都提供了解决方案
之前也写过一篇ScrollView
嵌套ListView
或GridView
等控件出现的各种问题的解决的最佳方案, 传送门点我
-
Java版本
recyclerView.setLayoutManager(new LinearLayoutManager(this){
@Override
public boolean canScrollVertically() {
//解决ScrollView里存在多个RecyclerView时滑动卡顿的问题
//如果你的RecyclerView是水平滑动的话可以重写canScrollHorizontally方法
return false;
}
});
//解决数据加载不完的问题
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(true);
//解决数据加载完成后, 没有停留在顶部的问题
recyclerView.setFocusable(false);
-
Koltin版本
recyclerView.layoutManager = object : LinearLayoutManager(context) {
//解决RecyclerView嵌套RecyclerView滑动卡顿的问题
//如果你的RecyclerView是水平滑动的话可以重写canScrollHorizontally方法
override fun canScrollVertically() = false
}
//解决数据加载不完的问题
recyclerView.isNestedScrollingEnabled = false
recyclerView.setHasFixedSize(true)
//解决数据加载完成后, 没有停留在顶部的问题
recyclerView.isFocusable = false
-
切记,切记,切记, 重要的事情说三遍, 还解决不了的时候看这里
关于嵌套后滑动卡顿或者焦点之类的问题
使用了上面的方法还无法解决就把布局中的RecyclerView
外层的ScrollView
换成NestedScrollView
就可以解决了
大概就改成这样
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>