【问题标题】:RecyclerView not display all data when submiting list repeatedlyRecyclerView在重复提交列表时不显示所有数据
【发布时间】:2021-05-28 07:13:35
【问题描述】:

我正在创建 Notes 应用程序,它显示来自本地数据库的用户 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
    })
}

NotesAdapter

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()
        }
        .......
    }
}

BindingUtil

@BindingAdapter("noteTitle")
fun TextView.setNoteTitle(item: Notes?) {
    item?.let {
        Log.v("BindingUtil ", "title -> "+ it.noteTitle)     // Log return expected data
        when (it.noteTitle.isEmpty()) {
            true -> visibility = View.GONE
            false -> text = item.noteTitle
        }
    }
}

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}" />

NotesAdapter 中的 NotesDiffCallBack

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
    }
}

数据库返回的'note'数据是正确的。 甚至 Log.v() 在“NotesFragment”和“BindingUtil”中都显示了正确的“note”数据, 但不会显示在 UI 上。 这真的很烦人。请帮忙!!

【问题讨论】:

  • 分享你的差异回调
  • 共享,diffcallback @Praveen 要求
  • 检查您的观察列表itadapter 已有的列表不同。如果您在观察中创建新的ArrayList&lt;Notes&gt;(it) 并这样做submitList(ArrayList&lt;Notes&gt;(it)),它可能会 diffUtill 工作。 DiffUtill 在应用不同的参考对象时有效。
  • 不,它也没有工作@liveAnyway

标签: android kotlin android-recyclerview android-binding-adapter


【解决方案1】:

检查when 语句中的哪些块被调用truefalse

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

visibilty = View.VISIBLEfalse 块内

【讨论】:

  • 我想知道为什么 recyclerview 有时表现异常?
  • @HimanshuSharma 这不是异常行为,它是回收站视图的默认行为。回收站视图重用屏幕上的膨胀项目来显示数据,因此当您设置一个标题的可见性消失后,当回收站视图将同一视图用于可见性可见的标题时,它的可见性是也消失了,因为它之前已设置为 GONE,但从未再次设置为可见。
  • 现在我明白了。谢谢!!
【解决方案2】:

你是在调用 submitList() 之后调用 notifyDataSetChanged() 吗?

【讨论】:

  • 不,我认为 diffUtils 可以处理列表中的此类更改,因此不需要 notifyDataSetChanged()。它的 UI 有时不工作。 RecyclerView 列表已正确更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
相关资源
最近更新 更多