奇怪的 recyclerview 刷新问题

Weird recyclerview refreshing issue

我正在尝试创建一个与 FTP 资源管理器同步的文件资源管理器,其功能之一是通知新下载的文件。为此,我将 file/folders 的路径存储在 Sharedpreferences 中,然后将它们与适配器中存储在 sharedprefs 中的新元素进行比较,如果条件成立,我会在 folder/file 旁边显示一个点姓名。它真的很棒,除了当我更新我的 recyclerview 时我用 notifyDataSetChanged() 切换回以前的 activity 来更新 file/folder 如果它们已被阅读,或者当我用 notifyItemRangeChanged() 对我的列表进行排序时.正如您在我的 GIF 中看到的那样,点随机出现在不好的位置。我希望我解释得很好,我该如何解决这个问题?我真的很接近,这很令人沮丧。

这是我的 onResume() :

    override fun onResume() {
    super.onResume()
    if(::recyclerViewRecents.isInitialized) {
        getRecentFiles()

        recyclerViewFolders.adapter?.notifyDataSetChanged()
        recyclerViewRecents.adapter?.notifyDataSetChanged()
    }
    }

这里是我的 notifydatasetchange,我什至尝试清除 recycledViewPool 但没有任何变化:

        recyclerViewFiles.adapter?.notifyItemRangeChanged(0,filesList.size)

谢谢

编辑:

这是我的适配器代码:

我检查 onBindViewHolder 文件是否注册显示点:

        val isRead: String? = prefNewFile.getString(currentFile.absolutePath, null)

    if (isRead!=null) {
        holder.fileIsRead.visibility = View.VISIBLE
        println(currentFile.name + " is unread")
    }

这里是我如何将其标记为已读:

private fun putAsRead(file: String) {
    println("$file read!")
    val editor: SharedPreferences.Editor = prefNewFile.edit()
    editor.remove(file)
    editor.apply()
    val folder = file.substring(0,file.lastIndexOf("/"))
    if(file.substring(file.lastIndexOf("/")) != "/CalvezDocs")
        putAsRead(folder)
}

解决方法是在 Visibility 上添加 else 选项。例如,holder.fileIsRead.isVisible = isRead == trueisRead != null 它是 if (isRead != null ) View.VISIBLE else View.GONE

的简短版本

问题的原因是 RecyclerView 重用了 ViewHolder,当适配器重用一个 ViewHolder 并且 holder.fileIsRead 之前设置为 View.VISIBLE,所以你的列表中有额外的项目。