回收者视图不会使用实时数据自动更新

问题描述

我的观察者正在工作,每当输入新记录时都会被调用

问题在于回收站视图仅显示一条记录,并且由于保存setClickListener而从未更新以显示其他记录。

我可以在我的数据库(带有LiveData的房间)中验证我有多个记录,适配器或ViewHolder出现问题。

PS ,此外,对于使用适配器的样式应做的事情的任何修改,都非常欢迎。我希望我做对了。

MainActivity onCreate方法

    viewmodel = viewmodelProvider(this).get(Bookviewmodel::class.java)

    save.setonClickListener {
        val book = Book(UUID.randomUUID().toString(),"author 2","book 2")
        viewmodel.insert(book)
    }

    val booklistadapter = Booklistadapter(this)
    recyclerView.adapter = booklistadapter
    recyclerView.layoutManager = linearlayoutmanager(this)

    viewmodel.allBooks.observe(this,Observer { books ->
        books?.let {
            Log.d(TAG,"onCreate: changed")
            booklistadapter.setBooks(books)
        }
    })

MainActivity中的静态类

private class Booklistadapter(private val context: Context): RecyclerView.Adapter<Booklistadapter.BookViewHolder>() {

    private var bookList: List<Book> = mutablelistof()

    // getting called only once
    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): Booklistadapter.BookViewHolder {
        val itemView = LayoutInflater.from(context).inflate(R.layout.list_item,parent,false)
        return BookViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: Booklistadapter.BookViewHolder,position: Int) {
        val book = bookList[position]
        holder.setData(book.author,book.book,position)
    }

    override fun getItemCount(): Int {
        Log.d("inner","getItemCount: ${bookList.size}") // this return correct size
        return bookList.size
    }

    fun setBooks(it: List<Book>?) {
        bookList = it!!
        notifyDataSetChanged()
    }

    private class BookViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

        fun setData(a: String,b: String,p: Int) {
            itemView.author.text = a
            itemView.book.text = b
        }
    }

}

解决方法

基于以下答案:How to update RecyclerView Adapter Data?我认为您必须从观察者方法notifyDataSetChanged而不是适配器类内部。

viewModel.allBooks.observe(this,Observer { books ->
    books?.let {
        Log.d(TAG,"onCreate: changed")
        bookListAdapter.setBooks(books)
        bookListAdapter.notifyDataSetChanged()
    }
})
fun setBooks(it: List<Book>) {
    bookList = it
}

此外,我认为您在使用会议室时可以尝试使用DiffUtil。它会在需要刷新时自动刷新布局,并且比每次更改数据时调用notifyDataSetChanged都要快。