Viewpager2嵌套RecyclerView导致的滑动卡顿

本文探讨了在ViewPager2中嵌套同方向滑动的RecyclerView导致的滑动不流畅问题。作者发现由于两个组件的滑动阈值相同,导致冲突。通过反射修改嵌套RecyclerView的mTouchSlop值,将其降低为5,从而提高了滑动的流畅性,解决了这一难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:

该方法可能是一种投机取巧的方法

我遇到的场景是Viewpager2嵌套RecyclerView同方向滑动,类似于天气APP中,多个城市(Viewpager2实现)和24小时预报(RecyclerView实现)都是同方向滑动,比如都是向左滑动。
这种情况下你就会发现24小时预报滑动起来特别不流畅,也就是一卡一卡的。当时也看了好多RecyclerView事件拦截,事件冲突的博客,还是没有理解为什么会出现这种情况。
然后偶然的一个思路出现了:因为Viewpager2也是用的RecyclerView,那么他们判断是否滑动的阈值(mTouchSlop)都是一样的,也就是16(这个值可以通过反射获取到)。所以只需要通过反射将嵌套的RecyclerView(24小时预报)中的mTouchSlop设置成一个较小的值,比如5就可以完美解决了

        Class clz = recyclerView.getClass();
        try {
            Field fields = clz.getDeclaredField("mTouchSlop");
            fields.setAccessible(true);
            Log.e("mTouchSlop:", String.valueOf(fields.getInt(recyclerView)));
            fields.setInt(recyclerView,5);
            Log.e("mTouchSlop:", String.valueOf(fields.getInt(recyclerView)));
        } catch (Exception e) {
            Log.e("error", e.getMessage());
        }
### ViewPager2RecyclerView 的区别 #### 基本功能差异 ViewPager2 是基于 RecyclerView 构建的组件,用于分页显示数据集合中的项目。而 RecyclerView 则是一个更通用的视图容器,旨在高效地滚动大量数据集[^1]。 - **布局管理器** RecyclerView 支持多种类型的 LayoutManager(线性、网格、瀑布流等),而 ViewPager2 默认采用 LinearLayoutManager 来实现水平方向上的页面切换效果。 - **适配器模式** 两者都依赖 Adapter 提供数据绑定机制,不过由于设计目的不同,在实际应用中有细微差别。RecyclerView 的 Adapter 更加灵活多变,可以适应不同的 item 类型;相比之下,ViewPager2 的 Adapter 主要是为了支持 Fragment 或 View 对象作为页面内容。 #### 性能优化方面 因为 ViewPager2 使用了 RecyclerView 的内部结构,所以在性能上继承了许多优点: - 自动缓存已加载过的页面; - 只有可见区域内的子项会被实例化并绘制出来; - 当用户快速翻阅多个页面时能够有效减少卡顿现象发生[^4]。 然而需要注意的是,当在一个复杂的场景里混合使用这两个控件时可能会遇到一些挑战,比如手势冲突等问题。这通常需要开发者通过自定义 TouchListener 或者调整触摸事件传递逻辑来解决。 ```java // 设置LinearLayoutManager防止嵌套滑动 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) { @Override public boolean canScrollVertically() { return false; } }; recyclerView.setLayoutManager(linearLayoutManager); ``` #### API 设计哲学的不同 尽管二者共享相似的基础架构和技术栈,但在API层面存在显著的区别: - ViewPager2 强调简单易用性和特定用途——即创建可滑动的内容分区; - RecyclerView 注重灵活性和扩展能力,允许开发人员构建几乎任何种类的数据列表展示形式。 综上所述,虽然它们之间有着密切的关系并且某些情况下看起来很像,但是各自专注于满足不同类型的应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值