数据更改时,RecyclerView不会保留滚动位置

时间:2020-03-31 12:22:39

标签: android android-recyclerview

我有一个文章列表,当新文章出现在服务器上时,我将显示一个按钮,通知用户。当用户单击此按钮时,我想加载最新文章并将其添加到列表的开头。加载新文章时,我在RecyclerView中显示它们的占位符项目(查看没有数据的文章项目的框架),然后滚动到列表顶部,以便显示最新文章。

问题在于,当获取新文章并替换占位符时,RecyclerView不会滚动到顶部,而是会滚动到以前的数据上,而我必须手动滚动到列表的顶部。

这可能与RecyclerView的尝试有关,以使用户滚动之前的位置,但是在这种情况下,用户不在此处。

此问题的解决方法是在RecyclerView上禁用动画,或者不使用DiffUtil进行数据差异,而是调用notifyDatasetChanged

我采用第二种方法是因为我想要动画

我创建了一个展示台repository,展示了这个问题。有两种活动,一种是使用香草RecyclerViewRecyclerView.Adapter,另一种是使用epoxy库。

整个类的代码非常复杂,我不确定哪个更相关,所以这就是整个Activity的样子。她模拟加载新文章

private fun simulateFetchNewArticles() {
        scope.launch {
            val newArticlesCount = 10
            adapter.items = (0 until newArticlesCount).map { Item.Placeholder("Placeholder $it") } + adapter.items
            delay(100)
            recyclerView.smoothScrollToPosition(0)
            delay(5000)
            // Uncomment for workaround fix
            // adapter.items = emptyList()
            adapter.items = (0 until newArticlesCount).map { Item.Article("New article $it") } + adapter.items.drop(newArticlesCount)
        }
    }

0 个答案:

没有答案