奇怪的 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 == true
或 isRead != null
它是 if (isRead != null ) View.VISIBLE else View.GONE
的简短版本
问题的原因是 RecyclerView 重用了 ViewHolder,当适配器重用一个 ViewHolder 并且 holder.fileIsRead 之前设置为 View.VISIBLE,所以你的列表中有额外的项目。
我正在尝试创建一个与 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 == true
或 isRead != null
它是 if (isRead != null ) View.VISIBLE else View.GONE
问题的原因是 RecyclerView 重用了 ViewHolder,当适配器重用一个 ViewHolder 并且 holder.fileIsRead 之前设置为 View.VISIBLE,所以你的列表中有额外的项目。