当前位置: 首页>移动开发>正文

nestedscrollview嵌套recyclerview滑动问题 scrollview嵌套recyclerview 复用

注:滑动卡顿,占据焦点,加载不全

相信大家都遇到过ScrollView嵌套RecyclerView或者RecyclerView嵌套RecyclerView来使用, 也会遇到一堆奇奇怪怪的问题, 比如滑动卡顿、数据加载不完、数据加载完后没有停留在顶部等问题

今天我们就来写一篇RecyclerView嵌套版本的解决方案

  • 今年六月份的IO大会把Kotlin用做Android开发的一级语言, 也让这个语言在Android开发圈子里大火了一把, 所以今天的代码是用Kotlin来实现(当然还是有Java版本的).
  • 由于Google公司大力推荐大家使用RecyclerView来代替ListViewGridView等等控件, 现在越来越多的开发者都已经上手了RecyclerView了.
  • 也推荐大家赶紧使用RecyclerView来代替ListView等等, 好处太多了也就不提了, 配合github上的一个开源工程使用简直绝配BaseRecyclerViewAdapterHelper

进入正题, 不多BB了

1. 第一种情况

两层RecyclerView嵌套这种需求也是很常见的一个需求了, 下面图片就是列举的一个案例

RecyclerView嵌套RecyclerView示例

2.第二种情况

一个页面中有个多个RecyclerView时,为了保证数据能完整加载, 一般都是在最外层加上一个ScrollView, 然而出现的一系列问题, 让人头大, 当然本文章也都提供了解决方案

ScrollView嵌套两个RecyclerView示例

之前也写过一篇ScrollView嵌套ListViewGridView等控件出现的各种问题的解决的最佳方案, 传送门点我

  • 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>

 

 

 

对 Recyclerview 的布局的测量不准确

在自己项目中的表现

自己通过 Debug 发现,传进 adapter 的 list 的size 为10 ,但是在进行显示数据的时 position 在经历了 0 、1 、2 后 ,该过程停止,数据停止了继续显示。而此时数据显示的高度正好为手机屏幕的高度大一些,表现为微小的滑动。

怎样显示全部

解决方案:

1. ScrollView --> NestedScrollView (NestedScrollView 解决了内部滑动冲突)

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:scrollbars="none">

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

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

2. RecyclerView 外部嵌套 RelativeLayout 或 LinearLayout

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

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

</RelativeLayout>

对于有edittext的可能会有问题,毕竟是获取焦点的2


https://www.xamrdz.com/mobile/4wz1932649.html

相关文章: