NestedScrollView+Recyclerview下滑卡顿解决方法

2018-02-17 23:33:20

直接在xml中定义,android:nestedScrollingEnabled="false"

官方文档:
Enable or disable nested scrolling for this view.
If this property is set to true the view will be permitted to initiate nested scrolling operations with a compatible parent view in the current hierarchy. If this view does not implement nested scrolling this will have no effect. Disabling nested scrolling while a nested scroll is in progress has the effect of stopping  the nested scroll.
这里设置为false,放弃自己的滑动,交给外部的NestedScrollView处理,就没有出现卡顿的现象了,并且有fling的效果


在6.0以上的手机并没有发现问题,不过在4.4的手机上,api为19的却依然卡顿,解决的办法。在java代码中设置。

recyclerView.setHasFixedSize(
true); recyclerView.setNestedScrollingEnabled(false);


解决了问题。


本文为大家解决安卓开发时候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下滑卡顿的所有方法,希望我们整理的东西能够真正帮助到你,喜欢的话就收藏一下吧。


  • 2020-04-14 09:42:47

    用 TypeScript 编写 npm 模块

    自从开始使用 Node.js 已经一年多,写的代码越多,越是觉得自己提高的越慢。想来应该有没有将单一功能的代码封装在一个独立模块,而导致代码稍微多一点就维护困难的原因。

  • 2020-04-14 09:46:25

    TypeScript 入门教程

    TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时的静态类型检查。 TypeScript 可处理已有的 JavaScript 代码,并只对其中的 TypeScript 代码进行编译。

  • 2020-04-14 09:51:03

    package.json 字段说明

    package.json 有很多字段,也有很多官方字段,我们需要知道他们的具体是做什么的才能很好的运用

  • 2020-04-14 15:35:52

    caniuse前端兼容性检查和使用

    相信大家都曾用caniuse网站查询过css、js的一些兼容性问题,并且都从它反馈的兼容性数据中获益,让我们的线上项目更加稳定、和谐的跑在用户电脑里。不过对于caniuse页面上的一些细节,我们可能会感到困惑或者模棱两可,今天就带着大家一起来重新认识caniuse这个网站,并对它的原理和细节做些探究。

  • 2020-04-15 17:00:07

    export和import的理解,这一篇问扎根就够了

    在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

  • 2020-04-15 21:14:13

    .d.ts与.ts的区别 .d.ts怎么用

    在TypeScript项目中直接引入Javascript包是不能使用的,因为包中缺少TypeScript类型声明,如果是自己写的包,可以考虑自己增加一个.d.ts类型声明文件,如果代码比较多或者使用的是第三方的包,自己写就比较麻烦了。第三方的包首先考虑找一个别人写好的声明文件,如果没有可以使用一些自动生成声明文件的工具。