前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NestedScrollView+Recyclerview下滑卡顿解决方法

NestedScrollView+Recyclerview下滑卡顿解决方法

作者头像
砸漏
发布2020-10-28 12:27:10
2.7K0
发布2020-10-28 12:27:10
举报
文章被收录于专栏:恩蓝脚本

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

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

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

代码语言:javascript
复制
<?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 

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

在布局文件中添加

代码语言:javascript
复制
android:nestedScrollingEnabled="false"

这一属性

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

代码语言:javascript
复制
mRecycler.setNestedScrollingEnabled(false);

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

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

通过代码

代码语言:javascript
复制
mRecycler.setHasFixedSize(false);

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

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

添加以下代码

代码语言:javascript
复制
mRecycler.setFocusable(false);

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

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

代码语言:javascript
复制
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setSmoothScrollbarEnabled(true);
layoutManager.setAutoMeasureEnabled(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false);

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

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

方案一

设置RecyclerView属性方法

代码语言:javascript
复制
recyclerView.setHasFixedSize(
true); recyclerView.setNestedScrollingEnabled(false);

或者直接在recycleview中 添加属性

代码语言:javascript
复制
android:nestedScrollingEnabled=”false”

方案二

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

代码语言:javascript
复制
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-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档