【发布时间】:2021-08-20 02:48:10
【问题描述】:
我知道有类似的问题,但是我就是找不到类似的东西,我一直在研究新的东西来学习,在将 kotlin 合成转换为viewvbinding 模式时,我遇到了这个错误
kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized at com.codepalace.chatbot.ui.MessagingAdapter.onBindViewHolder(MessagingAdapter.kt:60) at com.codepalace.chatbot.ui.MessagingAdapter.onBindViewHolder(MessagingAdapter.kt:17)
它说我必须初始化绑定,但我不知道放在哪里。
这是代码。
class MessagingAdapter: RecyclerView.Adapter<MessagingAdapter.MessageViewHolder>() {
var messagesList = mutableListOf<Message>()
private lateinit var binding: MessageItemBinding
inner class MessageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
init {
itemView.setOnClickListener {
//Remove message on the item clicked
messagesList.removeAt(adapterPosition)
notifyItemRemoved(adapterPosition)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageViewHolder {
return MessageViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.message_item, parent, false)
)
}
override fun getItemCount(): Int {
return messagesList.size
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: MessageViewHolder, position: Int) {
val currentMessage = messagesList[position]
when (currentMessage.id) {
SEND_ID -> {
holder.itemView.findViewById<View>(R.id.tv_message).apply {
binding.tvMessage.text = currentMessage.message
visibility = View.VISIBLE
}
holder.itemView.findViewById<View>(R.id.tv_bot_message).visibility = View.GONE
}
RECEIVE_ID -> {
holder.itemView.findViewById<View>(R.id.tv_bot_message).apply {
binding.tvBotMessage.text = currentMessage.message
visibility = View.VISIBLE
}
holder.itemView.findViewById<View>(R.id.tv_message).visibility = View.GONE
}
}
}
fun insertMessage(message: Message) {
this.messagesList.add(message)
notifyItemInserted(messagesList.size)
}
【问题讨论】:
-
为什么适配器类中有
MessageItemBinding?我认为它应该放在ViewHolder类中,所以在你的情况下是MessageViewHolder -
你能举个例子吗?
-
我还是新手,所以我不太了解该放在哪里。
-
好的,我可以尝试做一个简短的例子,并展示我如何制作 RecyclerView 适配器
-
非常感谢,但是为了使用 xml 文件中的 id,我必须使用 MessageItemBinding,如果我尝试更改它,它也会出错
标签: android kotlin android-recyclerview data-binding