项目在更新后隐藏在 RecyclerView 中,直到用户滚动
Items are hidden from RecyclerView after update till user scroll
我有一个带有 RecyclerView 的片段 [DISPLAY SCREEN] 在用户点击它的项目后,应用程序打开屏幕 [EDIT SCREEN] 以允许用户编辑那个 itme。
当用户完成更新时,我关闭片段 [EDIT SCREEN] 并返回 [DISPLAY SCREEN] 并向 api 发出新请求以再次获取数据
我检查了接受来自 api 数据的更新方法的线程,线程是 main
private fun updateScreen(data: List<GymPackage>) {
"updateScreen size ${data.size} pageNumber $pageNumber , thread num ${Thread.currentThread().name}".log(mTag)
if (pageNumber++ == 1)
packagesAdapter.clear()
packagesAdapter.append(data)
("updateScreen size ${data.size} pageNumber $pageNumber ,, adapter ${packagesAdapter.itemCount}, ${packagesAdapter.getItemViewType(0)}" +
",${(packagesRecyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()}").log(mTag)
/**
* after get first page sometimes items not being shown so scroll to first item
*/
packagesRecyclerView.scrollBy(0 , 50)
loadMore = data.size == pageSize
packagesAdapter.loadingProgressBar = data.size == pageSize
tvNoData?.visibility = (packagesAdapter.itemCount == 0).gotViewVisiblity(true)
}
输出:
当 [DISPLAY SCREEN] 获取项目列表时,前两行,
- 线程是主线程
- RecyclerView 适配器内的 n 个项目 -> 5
- 0 是 RecyclerView 中第一个可见项的索引
[编辑屏幕]return 之后的第二个两行
- 线程是主线程
- RecyclerView 适配器内的 n 个项目 -> 5
- -1 是 RecyclerView 中第一个可见项目的索引 --> 所以用户看不到任何项目
当用户滚动时,他可以正常看到项目。
我尝试使用
使 rv 滚动
packagesRecyclerView.scrollBy(0 , 50)
还有
packagesRecyclerView.scrollToPosition(0)
都没有结果
更新 1
试过这些
- packagesAdapter.notifyDataSetChanged()
- packagesRecyclerView.performClick()
没有结果
更新 2
使用 beta7 Google 表示它提供了
的修复
- MotionLayout 中的嵌套滚动视图问题
- MotionLayout 的转换侦听器问题
- MotionLayout 内存泄漏
- RecyclerView 性能
- 群组可见度
- 填充问题
在我将 lib 更新为之后,应用程序运行正常,但运动在填充方面存在其他问题
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta7'
Return 到 beta4
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
并使用
motion.transitionToStart()
我有一个带有 RecyclerView 的片段 [DISPLAY SCREEN] 在用户点击它的项目后,应用程序打开屏幕 [EDIT SCREEN] 以允许用户编辑那个 itme。 当用户完成更新时,我关闭片段 [EDIT SCREEN] 并返回 [DISPLAY SCREEN] 并向 api 发出新请求以再次获取数据
我检查了接受来自 api 数据的更新方法的线程,线程是 main
private fun updateScreen(data: List<GymPackage>) {
"updateScreen size ${data.size} pageNumber $pageNumber , thread num ${Thread.currentThread().name}".log(mTag)
if (pageNumber++ == 1)
packagesAdapter.clear()
packagesAdapter.append(data)
("updateScreen size ${data.size} pageNumber $pageNumber ,, adapter ${packagesAdapter.itemCount}, ${packagesAdapter.getItemViewType(0)}" +
",${(packagesRecyclerView.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()}").log(mTag)
/**
* after get first page sometimes items not being shown so scroll to first item
*/
packagesRecyclerView.scrollBy(0 , 50)
loadMore = data.size == pageSize
packagesAdapter.loadingProgressBar = data.size == pageSize
tvNoData?.visibility = (packagesAdapter.itemCount == 0).gotViewVisiblity(true)
}
输出:
当 [DISPLAY SCREEN] 获取项目列表时,前两行,
- 线程是主线程
- RecyclerView 适配器内的 n 个项目 -> 5
- 0 是 RecyclerView 中第一个可见项的索引
[编辑屏幕]return 之后的第二个两行
- 线程是主线程
- RecyclerView 适配器内的 n 个项目 -> 5
- -1 是 RecyclerView 中第一个可见项目的索引 --> 所以用户看不到任何项目
当用户滚动时,他可以正常看到项目。
我尝试使用
使 rv 滚动 packagesRecyclerView.scrollBy(0 , 50)
还有
packagesRecyclerView.scrollToPosition(0)
都没有结果
更新 1
试过这些
- packagesAdapter.notifyDataSetChanged()
- packagesRecyclerView.performClick()
没有结果
更新 2
使用 beta7 Google 表示它提供了
的修复- MotionLayout 中的嵌套滚动视图问题
- MotionLayout 的转换侦听器问题
- MotionLayout 内存泄漏
- RecyclerView 性能
- 群组可见度
- 填充问题
在我将 lib 更新为之后,应用程序运行正常,但运动在填充方面存在其他问题
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta7'
Return 到 beta4
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
并使用
motion.transitionToStart()