【问题标题】:Recycler view not updating automatically with live data回收站视图未使用实时数据自动更新
【发布时间】:2020-08-12 22:43:10
【问题描述】:

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

问题在于,recycler 视图只显示一条记录开始,并且它从不更新自身以显示其他记录作为 save setClickListener 的结果。

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

P.S. 非常欢迎对带有适配器的模式进行任何修改。我希望我做对了。

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

}

【问题讨论】:

  • 你找到解决办法了吗!

标签: android kotlin android-recyclerview android-livedata


【解决方案1】:

基于此答案: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
}

另外,当你使用 Room 时,我认为你可以尝试使用 DiffUtil。它会在需要刷新时自动刷新布局,并且比每次更改您的数据时调用notifyDataSetChanged 快得多。

【讨论】:

  • 我也试过了,还是不行,我只看到一条记录,肯定还有别的。
猜你喜欢
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多