我想在我的应用程序中实现
RecyclerView
以及 Firebase。我有一个简单的 firebase 结构:
消息节点下的密钥是通过参考
.push()
随机生成的。这些值只是一些虚拟消息。
型号
data class Message (val message: String? = null)
主要活动
private lateinit var mAdapter: MessageAdapter
...
myRef = FirebaseDatabase.getInstance().getReference("Message")
//Set database query
val messages = FirebaseRecyclerOptions.Builder<Message>()
.setQuery(myRef, Message::class.java)
.build()
mAdapter = MessageAdapter(messages)
//Read data
val rv = findViewById<RecyclerView>(R.id.messages_rv)
rv.layoutManager = LinearLayoutManager(this)
rv.adapter = mAdapter
适配器
class MessageAdapter(messages: FirebaseRecyclerOptions<Message>) :
FirebaseRecyclerAdapter<Message, MessageAdapter.ViewHolder>(messages) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.message_row, parent, false)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int, model: Message) {
holder.message.text = model.message
}
// Make a textview variable, and initiate it in the init block, which will be called first after creating the ViewHolder object
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val message: TextView = view.findViewById(R.id.message_tv)
}
}
不幸的是,我的应用程序因以下错误而崩溃:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.myapplication.Message
我尝试对数据库进行不同的引用,但它们都不起作用。我该如何解决?
当您使用以下参考时:
myRef = FirebaseDatabase.getInstance().getReference("Message")
然后将其传递给
setQuery()
方法:
.setQuery(myRef, Message::class.java)
您的适配器期望在屏幕上渲染
Message
对象。然而,在 Message
节点下,没有这样的对象,只有字符串。如果您想将节点映射到 Message
类型的对象,那么您应该考虑使用如下所示的模式:
db
|
--- Message
|
--- $pushedId
| |
| --- message: "asd"
|
--- $pushedId
|
--- message: "asd13"
这意味着实际消息应该存在于推送的 ID 下。