我有一个RecyclerView(1.2.1),使用List adapter和ViewHolder,并由Room PagingSource支持。列表中有大约700个项目。分页似乎正常工作,并且我已尽可能地减少了View层次结构的嵌套。
在刚开始加载RecyclerView时,一切都很好。分页工作正常,一切看起来流畅。适配器中的onCreateViewHolder被调用了14次,并且最初在屏幕上显示了5个。
滑动速度较慢也没有问题(它比我预期的调用了onCreateViewHolder函数更多,但没有任何卡顿)。
问题出现在快速滑动列表时。在3-5个快速滑动后,它似乎决定需要具有更多缓存的view holder,并且会多次调用onCreateViewHolder——该方法的时间为~5ms,但调用次数太多,滚动停止了。它似乎会调用onCreateViewHolder ~700次——与列表项数量相同,就像根本没有回收视图一样。
此时,有时应用程序将恢复正常,此时一切都很流畅,而且似乎不需要创建更多ViewHolders。然而,有时我会得到ANR对话框。
我已经尝试过调整recyclerView.recycledViewPool.setMaxRecycledViews(),但这似乎无法增加recycledViewCount,直到进行大量的onCreateViewHolder调用之后。
是否有任何办法解决这个问题?使滑动速度更慢?调整视图持有者回收方式,以便它不会发疯并试图一次创建那么多?
考虑到我的设计和数据限制,我认为无法改进布局膨胀。即使我可以,也创建了太多内容,无法在16ms内完成!
在刚开始加载RecyclerView时,一切都很好。分页工作正常,一切看起来流畅。适配器中的onCreateViewHolder被调用了14次,并且最初在屏幕上显示了5个。
滑动速度较慢也没有问题(它比我预期的调用了onCreateViewHolder函数更多,但没有任何卡顿)。
问题出现在快速滑动列表时。在3-5个快速滑动后,它似乎决定需要具有更多缓存的view holder,并且会多次调用onCreateViewHolder——该方法的时间为~5ms,但调用次数太多,滚动停止了。它似乎会调用onCreateViewHolder ~700次——与列表项数量相同,就像根本没有回收视图一样。
此时,有时应用程序将恢复正常,此时一切都很流畅,而且似乎不需要创建更多ViewHolders。然而,有时我会得到ANR对话框。
我已经尝试过调整recyclerView.recycledViewPool.setMaxRecycledViews(),但这似乎无法增加recycledViewCount,直到进行大量的onCreateViewHolder调用之后。
是否有任何办法解决这个问题?使滑动速度更慢?调整视图持有者回收方式,以便它不会发疯并试图一次创建那么多?
考虑到我的设计和数据限制,我认为无法改进布局膨胀。即使我可以,也创建了太多内容,无法在16ms内完成!
MyViewHolder(LayoutInflater.from(...))
创建 MyViewHolder 本身几乎不需要时间 - 它只是进行了大约十几个 itemView.findViewById 调用和查找了一些颜色 - 只需几微秒即可完成。绝大部分时间来自于布局膨胀。 - Markprotected Executor myExecutor = Executors.newSingleThreadExecutor();
。 - Daniel