欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

NestedScrollView+Recyclerview下滑卡顿解决方法

程序员文章站 2023-11-17 19:59:04
大家在进行安卓开发用到nestedscrollview+recyclerview的时候,经常出现的情况就是加载下滑的时候没有任何问题,很流畅,但是在下滑以后明显出现了卡顿的...

大家在进行安卓开发用到nestedscrollview+recyclerview的时候,经常出现的情况就是加载下滑的时候没有任何问题,很流畅,但是在下滑以后明显出现了卡顿的情况,小编根绝这个问题,给大家再来的解决方法,一起来学习下。

我们先来看下这个bug的表现:
1.滑动卡顿,
2.加载下滑时流畅,下滑时明显的卡顿
3.进入页面时直接加载recyclerview部分的内容(这里我理解为控件惯性,不知道对不对-------尴尬!!!!!!)
下面我们一一来解决这些问题

在开发项目中,涉及到到商品详情页,新闻详情页等的页面时,通常情况下,商品详情页的底部会附上商品的评论或者是相关商品的的推荐,或者是相关性的文章.那么我们就会用到列表的recyclerview,在头部可能是一些比较复杂的多种界面,可能采用比较简单的方法来处理,那就是nestedscrollview+recyclerview,这这种方式比较直观和方便操作.比如像下面的代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.nestedscrollview
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:id="@+id/scrollview_comment"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 >

 <linearlayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
 .....此处省略  
  <linearlayout
   android:layout_width="match_parent"
   android:layout_height="44dp"
   android:gravity="center">

   <linearlayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <imageview
     android:layout_width="20dp"
     android:layout_height="20dp"
     android:src="@color/text_msg_33"/>

    <textview
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_marginleft="12dp"
     android:layout_marginright="12dp"
     android:text="1"
     android:textcolor="#8c8c8c"
     android:textsize="15sp"/>

    <imageview
     android:layout_width="20dp"
     android:layout_height="20dp"
     android:src="@color/text_msg_33"/>
   </linearlayout>

   <textview
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:layout_marginright="10dp"
    android:background="@drawable/bg_shop_card"
    android:gravity="center"
    android:paddingleft="8dp"
    android:paddingright="8dp"
    android:text="加入购物车"
    android:textcolor="@color/white"
    android:textsize="14sp"/>
  </linearlayout>

  <view
   android:layout_width="match_parent"
   android:layout_height="10dp"
   android:background="#f2f2f2"/>

  <linearlayout
   android:layout_width="match_parent"
   android:layout_height="35dp"
   android:gravity="center_vertical">

   <textview
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginleft="11dp"
    android:text="用户评价"
    android:textcolor="#666666"
    android:textsize="13sp"/>

   <textview
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginleft="@dimen/line_1px"
    android:layout_marginright="20dp"
    android:text="(21313)"
    android:textcolor="#666666"
    android:textsize="13sp"/>

  </linearlayout>

  <view
   android:layout_width="match_parent"
   android:layout_height="0.5dp"
   android:background="#dcdcdc"/>

  <android.support.v7.widget.recyclerview
   android:id="@+id/recycler_seller_comment"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:descendantfocusability="blocksdescendants"
   android:nestedscrollingenabled="false"
   />

  <textview
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="查看更多"
   android:textcolor="#8c8c8c"
   android:textsize="13sp"/>
 </linearlayout>
</android.support.v4.widget.nestedscrollview>

首先.滑动动卡顿的问题.

在布局文件中添加

android:nestedscrollingenabled="false"

这一属性

或者通过代码设置也是可以的,

mrecycler.setnestedscrollingenabled(false);

这样滑动的时候就不会出现有卡顿的现象.

其次是加载上下滑动加载流畅时

通过代码

mrecycler.sethasfixedsize(false);

对于第三种现象,我找了很多方法,都以失败而告终,其实出现这种情况是应为recyclerview在加载数据的时候获取到了焦点导致,所

以只需要在对recylerview在带中设置不能获取焦点即可.

添加以下代码

mrecycler.setfocusable(false);

 

以上是小编测试过的解决方法,接下来,我们再给大家分享一篇简单的方法代码:

 最开始使用scrollview的时候嵌套listview会出现item显示不全等一些问题,现在google提供nestedscrollview已经可以解决该问题,但是在使用nestedscrollview嵌套recyclerview的时候会发现我们在recyclerview上滑动的时候没有了滚动的效果,查看文档找到的解决办法:

 linearlayoutmanager layoutmanager = new linearlayoutmanager(this);
  layoutmanager.setsmoothscrollbarenabled(true);
  layoutmanager.setautomeasureenabled(true);

  recyclerview.setlayoutmanager(layoutmanager);
  recyclerview.sethasfixedsize(true);
  recyclerview.setnestedscrollingenabled(false);

就在小编完稿的时候,又发现了两种方法,大神真的是多啊,一起整理后分享给你

当scrollview嵌套recyclerview时,会出现滑动卡顿,不平滑的效果。对此有两种解决方案。

方案一

设置recyclerview属性方法

recyclerview.sethasfixedsize(
true); recyclerview.setnestedscrollingenabled(false);

或者直接在recycleview中 添加属性

android:nestedscrollingenabled="false"


方案二

如果方案一无效,不妨试试重写scrollview的onintercepttouchevent()方法,强制让其触摸事件都交给其子控件去处理

public class recyclescrollview extends scrollview {
private int downx;
private int downy;
private int mtouchslop;
public recyclescrollview(context context) {
super(context);
mtouchslop = viewconfiguration.get(context).getscaledtouchslop();
}
public recyclescrollview(context context, attributeset attrs) {
super(context, attrs);
mtouchslop = viewconfiguration.get(context).getscaledtouchslop();
}
public recyclescrollview(context context, attributeset attrs, int defstyleattr) {
super(context, attrs, defstyleattr);
mtouchslop = viewconfiguration.get(context).getscaledtouchslop();
}
@override
public boolean onintercepttouchevent(motionevent e) {
int action = e.getaction();
switch (action) {
case motionevent.action_down:
downx = (int) e.getrawx();
downy = (int) e.getrawy();
break;
case motionevent.action_move:
int movey = (int) e.getrawy();
if (math.abs(movey - downy) > mtouchslop) {
return true;
}
}
return super.onintercepttouchevent(e);
}
}

通过以上操作,界面就不会再卡顿了,还原了原本的惯性。

以上就是关于nestedscrollview+recyclerview下滑卡顿的所有方法,希望我们整理的东西能够真正帮助到你,喜欢的话就收藏一下吧。