Android进阶之旅(第九天:ViewPager2与RecyclerView的手势冲突)

本文介绍了作者在工作中遇到的关于ViewPager2与RecyclerView滑动冲突的问题,详细解释了滑动冲突和手势冲突的概念,并分享了解决方案,包括外部拦截和内部拦截的事件分发机制。
摘要由CSDN通过智能技术生成

一、今日总结和明日规划(与手势冲突无关,不感兴趣的直接看后面)

大家好,今天又是充实的一天,改了插入文案的脚本,核对文案,这是基本的工作完成

在此基础上,毕设有重大进展:

  更新push_history 
    1.5.0_H包发布 
    优化音频播放进度条展示
    fix:noteBook空指针闪退bug 
    fix:recycleView滑动卡顿以及位置变换 
    fix:recyclerView会突然再次排序 
    fix:图片添加Dialog出两次 
    fix:ViewPager2与内部的recycleView的滑动冲突(巨难):https://juejin.cn/post/6886037403413250062 
    回退禁止滑动(前辈写的也有滑动冲突,尝试解决) 
    fix:select空指针crash 

核心是解决了ViewPager2与RecyclerView的滑动冲突,今天也着重讲它,到底什么是滑动冲突?怎么解决它,我会讲出我的理解,我认为我都可以理解,你也一定可以理解!

那么首先规划明天:

明日计划:

1.尝试修复ViewPager2与recycleView的滑动冲突

2.看FeedBack生成日志的逻辑

3.尝试实现生成trcak的Log

二、什么是滑动冲突,什么时手势冲突?

好的,回归正题,现在开始介绍今天的核心:滑动冲突和手势冲突

顾名思义,前者就是滑动导致的,后者就是手势导致的

你可能会觉得我在放屁,不错,这样解释显然是啥子行为,按么老规矩,先带大家问下gpt:

看了gpt,是不是有种看课本定义的感觉,不过其实我感觉还好,可以看懂,那么我再补充解释一下:

直接看图:

还有更简单的,你打开你的qq,首页展示了你的最近聊天,你会发现左滑某一个记录,会出现置顶、标为已读,删除,对吧

但是你注意一下,最下面是不是有5个item:

那么很简单,当你在左滑item时,下面的选中变换了,比如你左滑了,选中的消息item被切换为了频道,那么这就是滑动冲突,你可能会问我哎他怎么不会这样?

我的评价是如果它存在滑动冲突,QQ的开发吃什么的?

而且他不一定是ViewPager+RecycleView,只是我看这是这样,谁也不知道腾讯具体怎么实现的

那么手势冲突呢,更简单,就是你本来想往下滑首页的消息,结果被切到了频道栏

简单不,其实没这么简单,我只是讲了几个特例,你可能会遇到更复杂的滑动冲突,还有其他种类的,我只是向你传输这种概念,那么接下来就讲一下怎么解决滑动冲突和手势冲突

三、如何解决滑动冲突

滑动冲突有很多,网上有很多针对不同的滑动冲突有不同的解决方案,主要是外部拦截和内部拦截

这当然不是我想出来的,这是前人的经验

外部拦截法就是重写父容器的事件拦截方法,内部拦截法 主要重写子容器的事件分发方法和父容器的事件拦截方法

是不是有点蒙,不知道是啥,不错,如果你是第一次看,你肯定看不懂,那么我来放个图来介绍事件分发的逻辑:

(图来自:Android事件分发机制详解:史上最全面、最易懂 - 简书

是不是很懵,我来一讲你就明白了:(下面是我的理解)

Android下,用户是用手指来与手机交互的

比如你点了一下QQ的图标,QQ被打开了。这叫点击事件

你在QQ首页滑动了一下手指,你的QQ记录往下滑动了。这叫滑动事件

你长按录音键,QQ开始录音。这叫长按事件

你松开手指,停止录音,你说的话被发了出去。这叫松开事件

你打王者荣耀,左手控制方向,右手按技能和普攻,这叫多指触摸

有没有感觉,好神奇呀,app能识别这么多手势

可是你稍微想一想,如果真的可以识别这么多手势,他的底层会不会很复杂

举个很简单的例子,我们的电脑可以实现各种网络访问,图片加载等等,但是他底层只是01的二进制码

那么在Android中,我上面的这些事件(其实如果按我这么分,能分很多),底层是什么

不错,底层就是手指触摸,不过他不会识别这么多(不过它识别的确实也不少)

其实如果你去看文档,下面还有很多,但是实际上最常用到的只有几种:

(图来自欧阳老师的AndroidStudio从零基础到App上线)

那么顺便看下欧阳老师对事件分发的总结图:

那么,我就参照这个图来解释下事件的分发:

不过光看这个你可能很懵,我就配一张我的毕设的Layout  Inspector:

比如你现在按了一下这个波浪形的图片(其实是我毕设的音频播放按键)

那么会发生以下事件:

app感受到了你的触摸,它的坐标就是你按下的坐标

然后app把这个触摸事件,Motion.DOWN传给了最外面的布局,也就是下面图中的LinearLayout

然后LinearLayout识别这个坐标是在它的ViewPager范围内

同理ViewPager识别到他在fragmentr内,fragment识别到是在recycleView内

recycleView识别到imageView内

你的一次触摸就这样穿到了最下面

然后触发的逻辑是从下往上传递,也就是上面图中的View向上走,最后走到线性布局

怎么样,这样一解释是不是豁然开朗,搞懂了原理,剩下的就简单了,不过篇幅有限,剩下的明天分享

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在使用ViewPager2嵌套RecyclerView时,建议使用FragmentStateAdapter来设置ViewPager2的适配器,并在每个Fragment中使用RecyclerView。这样可以确保在滑动ViewPager2时,RecyclerView能够正确地重用并显示不同的数据。 同时,由于RecyclerView默认会拦截滑动事件,导致ViewPager2的滑动失效,因此需要在RecyclerView中禁用滑动事件的拦截。可以通过设置RecyclerView的NestedScrollingEnabled属性为false来实现,即recyclerView.setNestedScrollingEnabled(false)。 另外,还需要在RecyclerView的Adapter中实现getItemCount()和getItemViewType()方法,并根据需要显示不同的布局类型。在使用多个RecyclerView的情况下,建议使用不同的ViewType来避免布局重复和数据错乱等问题。 总之,正确地使用ViewPager2RecyclerView嵌套需要考虑多方面的因素,包括适配器、布局、事件处理等等。需要仔细思考和实践,才能达到最佳效果。 ### 回答2: ViewPager2Android 系统中的一个控件,可以用来创建包含多个页面的用户界面。而 RecyclerView 则是一个用于显示大量数据列表的控件。嵌套 ViewPager2RecyclerView 可以带来更加丰富的用户界面和更好的交互体验。 在将 RecyclerView 嵌套到 ViewPager2 中时,需要注意以下几点: 1. 使用 FragmentStateAdapter 或 RecyclerView.Adapter ViewPager2 中的每一页都可以是一个 Fragment 或 View,我们可以使用 FragmentStateAdapter 或 RecyclerView.Adapter 作为 ViewPager2 的数据源。如果我们使用 RecyclerView.Adapter,可以创建多个 RecyclerView,每个 RecyclerView 显示不同的数据列表,而每个列表可以是独立的数据流。而使用 FragmentStateAdapter,我们可以创建不同的 Fragment,每个 Fragment 显示自己独立的数据流。 2.设置recyclerView为可滑动 当我们将 RecyclerView 嵌套在 ViewPager2 中时,需要为 RecyclerView 设置合适的滑动方式。默认情况下,RecyclerView 会拦截 ViewPager2 的滑动事件,导致 ViewPager2 的滑动失效。我们可以使用 setNestedScrollingEnabled 方法为 RecyclerView 开启嵌套滑动,或使用 ViewPager2.OnPageChangeCallback 监听 ViewPager2 的滑动事件,并通过调用 RecyclerView 的 scrollBy 和 scrollToPosition 方法使得 RecyclerView 能够正确滑动。 3.注意 RecyclerView 的布局 在将 RecyclerView 嵌套在 ViewPager2 中时,需要给 RecyclerView 设置适当的布局,以免出现滑动冲突、数据显示过大等问题。我们可以对 RecyclerView 进行水平或垂直的滚动,但需要注意 RecyclerView 的布局高度。 综上,ViewPager2RecyclerView 的组合可以带来更加丰富和高效的用户界面和交互体验。它可以用于显示各种类型的列表数据,并通过 ViewPager2 的分页显示功能提供更好的用户体验。但在使用时如上文所述,需要注意一些细节问题。 ### 回答3: ViewPager2RecyclerView都是Android中常用的控件之一。ViewPager2是一个可滑动的容器,常用于页面之间的切换和滑动;RecyclerView是一个高度可定制的列表工具,可用于呈现大量数据,并提供了很多的回收和性能优化功能。 在某些场景下,需要ViewPager2嵌套RecyclerView来实现滑动和展示数据的需求,这种需求可能出现在新闻客户端中,每个tab对应一种类型的新闻,每种类型的新闻数据量很大。这时候就可以考虑使用ViewPager2嵌套RecyclerView来优化用户体验和性能。 具体的实现方法如下: 1、创建一个Activity或Fragment来承载ViewPager2; 2、在ViewPager2中添加多个Fragment,每个Fragment都对应一个tab,包含一个RecyclerView; 3、在Fragment中创建一个合适的适配器类Adapter; 4、在Adapter中重写onCreateViewHolder、onBindViewHolder和getItemCount等方法,并将RecyclerView需要的数据进行绑定; 5、在使用RecyclerView时考虑合适的数据源和异步加载等优化。将RecyclerView中的数据源从Main Thread中移除,使用异步线程进行数据的加载和显示; 6、在ViewPager2中添加TabLayout用于切换不同的Fragment。 需要注意的是,ViewPager2嵌套RecyclerView能够实现数据的高效切换和渐变。为了更好地优化性能,应该尽量减少RecyclerView的嵌套层数,并考虑分页加载等策略来优化加载速度和性能。 总之,ViewPager2嵌套RecyclerView是一种常用的Android开发技术,可以使用它来优化用户体验和性能,提高应用的质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值