gpt4 book ai didi

android - 回收者 View 不会使用实时数据自动更新

转载 作者:行者123 更新时间:2023-12-02 13:41:05 25 4
gpt4 key购买 nike

我的观察者正在工作,只要输入新记录,它就会被调用,
问题在于,回收站 View 仅显示一条记录开始,并且由于保存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
}
}

}

最佳答案

基于以下答案: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都要快得多。

关于android - 回收者 View 不会使用实时数据自动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63385645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com