android - PagedListAdapter:奇怪的运行时行为
问题描述
我在专门用于聊天的片段中使用 PageListAdapter(就像在任何现代消息传递应用程序中一样)。我最初只使用 RecyclerView,但它非常紧张。之后,我进一步搜索并发现了 PagedListAdapter,但是,它在这里有其独特的限制和错误。这是更加紧张和奇怪的滚动行为。每当在使用 RxJava Flowable 加载的 DB 中更改数据时,大多数视图都会重新创建,因为 RecyclerView 中的所有消息/视图开始闪烁,滚动位置会自动更改并滚动到中间的某个位置。
所以,基本上我有这些问题:
如何从 PagedListAdapter 的最后一页开始视图?如何防止 PagedListAdapter 自动滚动?
解决方案
在(来自 beta3/beta4)RecyclerView
内部使用时,我遇到了类似的问题。MotionLayout
我MotionLayout
用来实现可滑动的叠加层(纵向从底部开始,水平模式从左侧开始)。在水平模式下,更新 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
}
推荐阅读
- attributes - 您如何使用 MDX 计算 MTD/YTD 平均工作日销售额?
- javascript - 有没有办法将treesitter语法拆分为多个文件?
- python - 搜索列,如果值不是全数字,则将值剪切并粘贴到同一行的另一列 python pandas
- flutter - Flutter:滚动到长表单验证失败的表单字段
- ios - 作为@noescape 传递给Objective-C 的闭包参数已经逃逸
- azure-devops - Azure devops 在发布中上传日志文件
- c - 在运行时给出其大小的向量的堆栈空间?(C代码)
- express - 带有传递嵌入式 JS 的 Express 中的 res.json
- java - 将静态值分配给Java中的对象值
- python - 使用烧瓶时出现 500 内部服务器错误