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

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

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

问题在于回收站视图仅显示一条记录,并且由于保存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都要快。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?