首页 > 解决方案 > PagedListAdapter:奇怪的运行时行为

问题描述

我在专门用于聊天的片段中使用 PageListAdapter(就像在任何现代消息传递应用程序中一样)。我最初只使用 RecyclerView,但它非常紧张。之后,我进一步搜索并发现了 PagedListAdapter,但是,它在这里有其独特的限制和错误。这是更加紧张和奇怪的滚动行为。每当在使用 RxJava Flowable 加载的 DB 中更改数据时,大多数视图都会重新创建,因为 RecyclerView 中的所有消息/视图开始闪烁,滚动位置会自动更改并滚动到中间的某个位置。

所以,基本上我有这些问题:

如何从 PagedListAdapter 的最后一页开始视图?如何防止 PagedListAdapter 自动滚动?

标签: androidandroid-adapter

解决方案


在(来自 beta3/beta4)RecyclerView内部使用时,我遇到了类似的问题。MotionLayoutMotionLayout用来实现可滑动的叠加层(纵向从底部开始,水平模式从左侧开始)。在水平模式下,更新 RecyclerView 工作正常,因为在水平模式下,覆盖占据了整个屏幕,RecyclerView 也是如此。但在纵向模式下,我只需要让叠加层滑动到屏幕的一半,因此RecyclerView不是全屏。

在这种情况下,整个视图在RecyclerView更新时改变了它的大小,创建了一个跳跃列表(当插入新的聊天消息时,列表会跳转到另一个位置)。

仍然没有弄清楚究竟是为什么,我无法确认这是因为 MotionLayout,但它是主要嫌疑人。

我的解决方案是固定高度,这样列表在更新时不会改变大小。我已经覆盖了getHeight函数LayoutManager并设置了我在onViewCreated()片段中得到的固定大小。此外,如果键盘出现,您需要保留此布局侦听器以更改大小。

requireView().viewTreeObserver.addOnGlobalLayoutListener {
            if (initialHeight != view.height) {
                initialHeight = view.height
                chatLayoutManager.requestLayout()
            }
        }
chatLayoutManager = object : LinearLayoutManager(requireContext(), VERTICAL, true) {
            override fun getHeight() = initialHeight
}

推荐阅读