android - lateinit 属性绑定(bind)尚未初始化

标签 android kotlin android-recyclerview data-binding

我知道有类似的问题,但我只是找不到类似的东西,我一直在学习新的东西来学习,同时将 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)

它说我必须初始化绑定(bind),但我不知道把它放在哪里。
这是代码。
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)
}

最佳答案

private lateinit var binding: MessageItemBinding


你没有初始化 binding对象,因为您将其定义为lateinit,那么您应该定义它。
这通常在 onCreateViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrackedActivityHolder {
    val inflater = LayoutInflater.from(parent.context)
    binding = DataBindingUtil.inflate<MessageItemBinding>(inflater, R.layout.message_item, parent, false)
    return MessageViewHolder(
        binding
    )
}
更新
您需要接受MessageItemBinding键入而不是 ViewMessageViewHolder构造函数,并使用 itemView.root获取列表项的 Root View 。
inner class MessageViewHolder(itemView: MessageItemBinding) : RecyclerView.ViewHolder(itemView.root) {
    init {
        itemView.root.setOnClickListener {

            //Remove message on the item clicked
            messagesList.removeAt(adapterPosition)
            notifyItemRemoved(adapterPosition)
        }
    }
}

关于android - lateinit 属性绑定(bind)尚未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67796722/

相关文章:

安卓后台服务和报警

java - 安卓 : Problems with accents and ñ

java - Picasso 不会下载有效的 URL

java - 回收器 View 不显示 fragment 中的项目

android - java.lang.NoSuchMethodException : <init> [class android. view.View] FirebaseRecyclerAdapter

java - 找不到符号方法 INFLATE ,android studio

android - 如何在 Android 中停止我的 VPN 服务?

android - kapt 发生异常 : java. lang.OutOfMemoryError: 超出 GC 开销限制

android - Kotlin OnClick 监听器

android - ItemDecoration 覆盖 getItemOffsets() 和动画