Android - 如何让 recyclerview ListAdpater 停止闪烁?

如何解决Android - 如何让 recyclerview ListAdpater 停止闪烁?

我有一个回收器视图,其适配器使用 listadapter(1.1.0 版):

class InnerEpisodeFragmentAdapter(
    private val actCtx: Context,) : listadapter<Episode,InnerEpisodeFragmentAdapter.MViewHolder>(COMParaTOR) {
...

recycler 视图由来自 Room 数据库 Episode 表的 kotlin 流提供:

vm.episodesFlow().asLiveData().observe(viewLifecycleOwner) { episodes ->
  episodes.let { adapter.submitList(it) }
}

@Query("SELECT * FROM Episode ORDER BY pubDate DESC")
fun episodesFlow(): Flow<List<Episode>>

除此之外,每次剧集表中的元组更改时,都会发出新的剧集列表并更新回收器视图。

它工作正常,但每次更新时都会出现可怕的 BLINK。它会给用户带来糟糕的体验。

当流发出新值时如何避免这种闪烁?

在我的应用程序的先前版本中,我使用了诸如 notifyDataSetChanged() 或 notifyItemChanged() 之类的函数,它们从不闪烁。我知道我仍然可以尝试使用这些函数,但如果我无法避免闪烁时我会非常失望使用 kotlin 流程,如上所示。谢谢。

解决方法

比较者

areItemsThesame() 被错误地实现。您正在比较的是旧对象和 newObject 可能不是相同对象的引用。相反,您有些人使用某种 uuid 来比较两者,例如主键。如果对象不同,它将返回 false,因此永远不会调用 areContentsTheSame,否则如果对象相同,则因为 oldObject 和 newObject 都指向相同的引用,所以它们没有比较内容的意义。

抱歉,我是从 Mobile 写的错误

,

======== 要求的附加信息 ======

我的比较器很好,完全符合我的要求。 例如,我希望在每个回收者视图项中实时更新 isPlayed。确实如此。但是整个列表一闪而过。回收站视图消失了几分之一秒,然后以更新的信息重新出现。

companion object {
    private val COMPARATOR = object : DiffUtil.ItemCallback<Episode>() {
        override fun areItemsTheSame(oldItem: Episode,newItem: Episode): Boolean {
            return oldItem === newItem
        }

        override fun areContentsTheSame(oldItem: Episode,newItem: Episode): Boolean {
            return (oldItem.id == newItem.id)
                    && (oldItem.isOnDisk == newItem.isOnDisk)
                    && (oldItem.downloadId == newItem.downloadId)
                    && (oldItem.isPlayed == newItem.isPlayed)
                    && (oldItem.isDeleted == newItem.isDeleted)
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?