【发布时间】:2015-07-10 05:44:21
【问题描述】:
以下方法有问题:
int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition();
我的目标:保存有关用户查看过哪些项目的分析数据。
为了做到这一点,我在两种不同的场景中调用了这个方法:
每次滚动都转为“空闲”状态,并检查可见项目是什么。在这种情况下,我得到了预期的索引。
当
RecyclerView对用户“可见”时。 现在这就是问题开始的时候。我希望当包含recyclerView 的片段通过onResume()时,调用findLastVisibleItemPosition()将返回可见项目。 但在这种情况下它返回 -1。 我猜这与 recyclerView + 适配器内部项目初始化相对于片段/活动生命周期的异步加载有关。
将此代码推迟几毫秒 - findLastVisibleItemPosition() 返回正确的索引。但我不想推迟使用处理程序+延迟可运行的硬编码,因为调度延迟可运行是我真正想做的解决方法:检测回收器视图何时完成充气并将所有视图绘制到屏幕上脚在里面..
所以我的问题基本上是:
如何检测 RecyclerView 何时完成所有初始化/测量/膨胀和绘制它的子项进入屏幕? (在任何用户交互之前..)。
是否有任何可靠的良好做法可以准确了解回收站视图中的哪些项目真正显示在屏幕上?
【问题讨论】:
-
嗨,@Tal Kanel 在这篇文章之后你得到了任何可靠的答案吗?我有点面临类似的问题。
-
@hadez30:我的解决方案是运行代码检查来自 UI 线程上的处理程序发布的可运行文件中的第一个可见项目(不延迟..)。这就是为什么它在 UI 队列末尾执行的原因,根据我的经验,这是在视图已经附加到回收器视图之后发生的
标签: android android-layout android-adapter android-recyclerview