之前我们讨论过 View的onAttachedToWindow ,onDetachedFromWindow 调用时机 。
这个机制在RecyclerView卡片中还适用吗?
例如我们在RecyclerView的Item的onBindViewHolder时,利用一个CountDownTimer去做一个倒计时显示 / 或者是有一个属性动画效果?
- 到底在什么时候可以cancel掉这个倒计时/ 动画,而不影响功能了(滑动到用户可见范围内,倒计时/动画 运作正常)?
- 有什么方法可以和onBindViewHolder 对应吗?就像onAttachedToWindow ,onDetachedFromWindow这样 。
更多问答 >>
-
每日一问 | 很久以前有Activity.onResume就是界面可见的说法,这种说法错了多少?
2020-03-15 23:10 -
每日一问 今天考察下 Fragment 相关两个不常见 API
2020-03-19 00:55 -
每日一问 LifeCycle 对于 Lifecycle.Event 为啥不直接分发,而是通过 Lifecycle.State 中转?
2020-04-19 14:42 -
每日一问 ViewPager 这个流传广泛的写法,其实是有问题的!
2020-03-26 00:10 -
2020-03-23 23:45
-
每日一问 | 事件到底是先到DecorView还是先到Window的?
2020-03-03 23:25 -
每日一问 Android有个GestureDetector很好用?那么你知道它内部是如何实现的吗?
2020-03-02 23:56 -
每日一问 很多时候我们说单例实现方式会提到「枚举实现」,那么枚举底层是如何实现的呢?
2020-02-23 22:18 -
2020-02-02 17:17
-
每日一问 “你这个布局可以在进入这个页面之前预加载,这样页面渲染就快了”可能有什么潜在的问题吗?
2020-01-20 01:05

在RecyclerView中,Item的这两个方法分别会在【首次出现】和【完全滑出屏幕】(即在屏幕中完全不可见)时回调(在Adapter中也可以重写同名方法,用来监听ViewHolder的出现和消失)。至于说适不适用,还是看具体需求,比如列表中的视频播放,在onAttachedToWindow和onDetachedFromWindow在RecyclerView中还适用吗?onDetachedFromWindow回调时暂停/停止还是合理的。但是像题目说的倒计时和属性动画效果,就不合适了,为什么呢?我们先粗略地温习一下RecyclerView的回收机制:RecyclerView在布局(自然滑动其实也是反复布局子View)时,会回收一些符合条件的ViewHolder,它会根据ViewHolder的状态来决定临时存放在哪个地方,且把这些临时存放ViewHolder的集合看作两种:onBindViewHolder能直接重用的(mAttachedScrap、mCachedViews);onBindViewHolder重新绑定数据的(mRecyclerPool.mScrap);
那么,这些留在mAttachedScrap,正常情况下,它会在RecyclerView每次布局时都用到:在布局子View时,会把全部子View所属的Holder,都临时放里面,计算好了每个子View的新位置后,会一个个从mAttachedScrap中取出来,当然了不一定是全部都会取出来的,因为可能本次布局,一些旧Item已经完全滑出屏幕了。mAttachedScrap中没有被取出来的ViewHolder会怎么样呢?正常情况下,它们会被扔到mCachedViews里面去(注意从mCachedViews中取出来时也是不用重新绑定数据的,即不会经过onBindViewHolder方法)。刚刚说过,当Item被完全滑出屏幕时,Adapter的onDetachedFromWindow和该Item的onDetachedFromWindow会被回调,也就是说,当onDetachedFromWindow被回调时,ViewHolder并没有真正被回收!如果这时候把倒计时/动画取消掉了,那么在它们再次出现在屏幕中的时候,就不会动了,因为是直接重用,不会重新绑定数据的。那应该在什么时候取消?
Adapter中有个onViewRecycled方法,看名字就知道是当Item被回收后回调的。。。没错了,这个方法回调时,表示这个Holder已经被扔进mRecyclerPool.mScrap里了,也就是再次取出的时候会经过onBindViewHolder方法重新绑定数据。倒计时/动画在这里取消的话,是完全没问题的(但记得保存当前进度,以便下次恢复)。所以与onBindViewHolder对应的方法,就是这个onViewRecycled了。有同学可能会说:我不见得非要在
可以是可以。。。但你这不是多做了事情了嘛,人家onViewRecycled方法中取消才能正常运作,我在onDetachedFromWindow中取消,在onAttachedToWindow恢复,不行吗?onBindViewHolder本来就已经承担了恢复的工作了。。。睡觉咯~
服
缘神
别,我是弟弟
嘻嘻嘻
这里有个疑问,这么说,在onBinderViewHolder其实也不适合启动属性动画和倒计时,应当在onAttachedToWindow进行吧,毕竟都还没显示,就进行动画,不合适吧? 之前没注意过,最 ...查看更多
这里有个疑问,这么说,在onBinderViewHolder其实也不适合启动属性动画和倒计时,应当在onAttachedToWindow进行吧,毕竟都还没显示,就进行动画,不合适吧? 之前没注意过,最近看了在AndroidX中ViewPager2的源码,ViewPager2可以说是RecycleView的封装。ViewPager2中,,在onBinderViewHolder()中进行Fragment的创建,而在onAttachedToWindow中判断是否需要进行Fragment的绑定,onViewRecycled()才会对Fragment进行销毁
。。。。不用纠结它有没有显示啊,严格来讲,你说的onAttachedToWindow,在回调时也还没显示,只是添加到了VG中而已。我们只需要确保这个View在屏幕中出现时能正确显示当前播放进度就行了。 ...查看更多
。。。。不用纠结它有没有显示啊,严格来讲,你说的onAttachedToWindow,在回调时也还没显示,只是添加到了VG中而已。我们只需要确保这个View在屏幕中出现时能正确显示当前播放进度就行了。至于你说的ViewPager2 Fragment在onAttachedToWindow中绑定数据,我认为不妥,因为在短距离上下滑动时,onAttachedToWindow的Holder的数据很可能还是可用的,不需要重新绑定数据,如果在这里去绑定,就做重复工了。
确实RecycleView上,不用纠结显不显示的问题...受的ViewPager2影响... 因为ViewPager2中是这样的,我指的是ViewHolder与Fragment的关系,在ViewPag ...查看更多
确实RecycleView上,不用纠结显不显示的问题...受的ViewPager2影响... 因为ViewPager2中是这样的,我指的是ViewHolder与Fragment的关系,在ViewPager2中我发现,滑动页面,会对不在pageLimit范围的后一个页面预先执行一次onBinderViewHolder,而不执行onAttachedToWindow...所以Fragment是在ViewHolder执行onAttachedToWindow之后才开始执行生命周期。 onBinderViewHolder中进行的是,判断是否需要新建Fragment以及恢复缓存的Fragment数据。
不对,上个回复我以为这个预加载只有ViewPager2有,原来在正常使用RecycleView的时候也会,即,假设当前可见4个item。轻微滑动页面,这是时候会调用第五个item的onBinderVi ...查看更多
不对,上个回复我以为这个预加载只有ViewPager2有,原来在正常使用RecycleView的时候也会,即,假设当前可见4个item。轻微滑动页面,这是时候会调用第五个item的onBinderViewHolder(第五个item还没可见)。所以如果过了几s再滑动,这时候才执行attach。那么倒计时写在onBinderViewHolder显然不合理了。当然还是要看具体需求,倒计时同样可能玩出花来。
onViewRecycled() 处理不能适应所有情况。 我遇到了这种状况,显示时动画在放,然后滑动出了屏幕,onDetachedFromWindow调用。当我再回来的时候,onAttachedTo ...查看更多
onViewRecycled() 处理不能适应所有情况。 我遇到了这种状况,显示时动画在放,然后滑动出了屏幕,onDetachedFromWindow调用。当我再回来的时候,onAttachedToWindow调用。可是我回来的时候音频播放结束了 ,动画应该也停止的,但是没有经过onViewRecycled,view的动画没有停止,所以页面显示就有问题了。 所以我这种情况,在attach和detach的时候也需要处理
这个问题其实就是因为动画和音频的时长不一致造成的吧。。你想啊,它们播放都是在同一时间开始播放,但期间二者都没有主动停止或重新开始过(动画的实现方式一般有两种:1. 每次要更新帧的时候才即时计算新的帧; ...查看更多
这个问题其实就是因为动画和音频的时长不一致造成的吧。。你想啊,它们播放都是在同一时间开始播放,但期间二者都没有主动停止或重新开始过(动画的实现方式一般有两种:1. 每次要更新帧的时候才即时计算新的帧;2. 开启子线程不断主动更新帧;所以即使onDetachedFromWindow方法回调,也是不影响动画的运行的,除非主动干涉),照你说的这种情况,就算Item没有滑出屏幕,一样会出现这个问题啊。。。
这问题挺有意思,猛一看一脸懵逼.还有这操作,我为啥还要在attach/detach操做...仔细一想....emmmmm