Android 重复提交列表时,RecyclerView不会显示所有数据

Android 重复提交列表时,RecyclerView不会显示所有数据,android,kotlin,android-recyclerview,android-binding-adapter,Android,Kotlin,Android Recyclerview,Android Binding Adapter,我正在创建Notes应用程序,用于显示本地数据库中的用户备注。该应用程序工作得很好,但当我多次尝试搜索(查询)笔记时,有些数据无法显示 应用程序截图: NotesViewModel class NotesViewModel(private val database: NotesDao) : ViewModel() { fun searchNotes(string: String) = database.searchNote(string) } 注释碎片 binding.sear

我正在创建Notes应用程序,用于显示本地数据库中的用户备注。该应用程序工作得很好,但当我多次尝试搜索(查询)笔记时,有些数据无法显示

应用程序截图:

NotesViewModel

class NotesViewModel(private val database: NotesDao) : ViewModel() {
    fun searchNotes(string: String) = database.searchNote(string)
}
注释碎片

binding.searchEditText.doOnTextChanged { text, _, _, _ ->
    notesViewModel.searchNotes("%$text%").observe(viewLifecycleOwner, {
        adapter.submitList(it)
        Log.v("NotesFragment: ", it.toString())           //Log return expected data
    })
}
记事本

class NotesAdapter(private val clickListener: NoteClickListener) : ListAdapter<Notes, NotesAdapter.NotesViewHolder>(NotesDiffCallBack()) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotesViewHolder {
        return NotesViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: NotesViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(clickListener, item)
    }
    
    class NotesViewHolder private constructor(private val binding: ListItemNotesBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(clickListener: NoteClickListener, item: Notes) {
            binding.note = item
            binding.clickListener = clickListener
            binding.executePendingBindings()
        }
        .......
    }
}

class NotesDiffCallBack : DiffUtil.ItemCallback<Notes>() {
    override fun areItemsTheSame(oldItem: Notes, newItem: Notes): Boolean {
        return oldItem.noteId == newItem.noteId
    }

    override fun areContentsTheSame(oldItem: Notes, newItem: Notes): Boolean {
        return oldItem == newItem
    }
}

list_item_notes.xml

<data>
    <variable
        name="note"
        type="com.example.notes.db.Notes" />
<data/>
...
<TextView
    android:id="@+id/note_title_textview"
    app:noteTitle="@{note}" />

...
NotesDapter中的NotesDiffCallBack

class NotesAdapter(private val clickListener: NoteClickListener) : ListAdapter<Notes, NotesAdapter.NotesViewHolder>(NotesDiffCallBack()) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotesViewHolder {
        return NotesViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: NotesViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(clickListener, item)
    }
    
    class NotesViewHolder private constructor(private val binding: ListItemNotesBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(clickListener: NoteClickListener, item: Notes) {
            binding.note = item
            binding.clickListener = clickListener
            binding.executePendingBindings()
        }
        .......
    }
}

class NotesDiffCallBack : DiffUtil.ItemCallback<Notes>() {
    override fun areItemsTheSame(oldItem: Notes, newItem: Notes): Boolean {
        return oldItem.noteId == newItem.noteId
    }

    override fun areContentsTheSame(oldItem: Notes, newItem: Notes): Boolean {
        return oldItem == newItem
    }
}

class-NotesDiffCallBack:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:注释,新项:注释):布尔值{
返回oldItem.noteId==newItem.noteId
}
覆盖有趣的内容相同(旧项:注释,新项:注释):布尔值{
返回oldItem==newItem
}
}
数据库返回的“备注”数据正确。 甚至Log.v()在“NotesFragment”和“BindingUtil”中都显示了正确的“note”数据, 但不要在UI上显示。
这真让人讨厌。请帮忙

在调用submitList()之后是否调用notifyDataSetChanged()?

当调用
语句时,检查
中的哪个块是
中的
true
还是
false

如果按预期执行
false
,则尝试设置


visiblity=View.VISIBLE
内部
false
block

共享您的diffcallbackshared,diffcallback@Praveen要求检查您的观察列表
它与
适配器
已有的列表不同。如果您在中创建新的
ArrayList(it)
,并像这样执行
submitList(ArrayList(it))
,它可能无法正常工作。DiffUtill在应用不同的引用对象时可以工作。不,它在@LiveAnyway也不起作用。不,我认为Diffutil可以处理列表中的此类更改,所以不需要notifyDataSetChanged()。它的UI有时不工作。RecyclerView列表已正确更新。我想知道为什么RecyclerView有时行为异常?@HimanshuSharma这不是异常行为,这是recycler视图的默认行为。“回收器视图”重复使用屏幕上已充气的项目来显示数据,因此,当您设置某个标题的可见性时,以及在此之后,当“回收器视图”对可见性可见的标题使用相同的视图时,然后它的可见性也消失了,因为它被设置得更早,但再也没有设置为可见。现在我明白了。谢谢