【问题标题】:App crashes with kotlin.UninitializedPropertyAccessException when I get value from Spinner当我从 Spinner 获得价值时,应用程序因 kotlin.UninitializedPropertyAccessException 而崩溃
【发布时间】:2021-08-24 07:47:54
【问题描述】:

当我硬编码需要更新的值时,我的应用程序可以正常运行并更新 firestore 中的字段。但是,当我使用以下代码从 spinner 获取值以更新 firestore 中的字段时,应用程序崩溃了。

我正在使用kotlinviewBinding

以下是Logcat中的错误

--------- beginning of crash 2021-06-07 14:00:12.155 23175-23175/com.trad E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.trad, PID: 23175
kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized
    at com.trad.ui.adapters.OrderStatusListAdapter.access$getBinding$p(OrderStatusListAdapter.kt:32)
    at com.trad.ui.adapters.OrderStatusListAdapter$onBindViewHolder$1.onClick(OrderStatusListAdapter.kt:84)
    at android.view.View.performClick(View.java:8160)
    at android.widget.TextView.performClick(TextView.java:16222)
    at android.view.View.performClickInternal(View.java:8137)
    at android.view.View.access$3700(View.java:888)
    at android.view.View$PerformClick.run(View.java:30236)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:246)
    at android.app.ActivityThread.main(ActivityThread.java:8512)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

2021-06-07 14:00:12.234 23175-23175/com.trad I/Process: 发送 信号。 PID:23175 SIG:9

下面是OrderStatusListAdapter.kt 类 指向第 32 行和第 84 行的错误在代码中作为注释提及。

open class OrderStatusListAdapter(         //LINE # 32 MENTIONED IN THE ERROR
        private val context: Context,
        private var list: ArrayList<OrderStatus>,
    
        ) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
        lateinit var newOrderStatus: Spinner
        private lateinit var binding: OrderStatusLayoutBinding
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    
            return MyViewHolder(
                LayoutInflater.from(context).inflate(
                    R.layout.order_status_layout,
                    parent,
                    false
                )
            )
        }
    
        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            val model = list[position]
    
            if (holder is MyViewHolder) {
    
                GlideLoader(context).loadProductPicture(
                    model.image,
                    holder.itemView.iv_order_status_item_image
                )
    
                val dateFormat = "dd MMM yyyy HH:mm"
                
                val formatter = SimpleDateFormat(dateFormat, Locale.getDefault())
    
                val calendar: Calendar = Calendar.getInstance()
                calendar.timeInMillis = model.order_datetime
    
                val orderDateTime = formatter.format(calendar.time)
                holder.itemView.tv_order_status_order_date.text = orderDateTime
    
    
                holder.itemView.tv_order_status_item_name.text = model.items[0].title
                holder.itemView.tv_order_status_item_price.text = "$${model.total_amount}"
 model.order_datetime.toString()
                holder.itemView.tv_order_status.text = model.order_status
                holder.itemView.tv_order_status_order_id.text = model.id
    
                holder.itemView.btn_order_status_change_status.setOnClickListener {
    
    binding.spnOrderChangeStatus.onItemSelectedListener = // LINE 84 MENTIONED IN THE ERROR
                        object : AdapterView.OnItemSelectedListener {
                            override fun onItemSelected(
                                parent: AdapterView<*>?,
                                view: View?,
                                position: Int,
                                id: Long
                            ) {
                                Toast.makeText(
                                    context,
                                    "Selected value is ${
                                        parent?.getItemAtPosition(position).toString()
                                    }",
                                    Toast.LENGTH_SHORT
                                ).show()
    
                                val newstat = parent?.getItemAtPosition(position).toString()
                                FirestoreClass().updateOrderStatus(model.id, newstat)
    
                            }
    
                            override fun onNothingSelected(parent: AdapterView<*>?) {
    
                            }
                        }
                }
    
                holder.itemView.ib_order_status_delete_product.visibility = View.GONE
    
                holder.itemView.setOnClickListener {
                    val intent = Intent(context, SoldProductDetailsActivity::class.java)
                    intent.putExtra(Constants.EXTRA_SOLD_PRODUCT_DETAILS, model)
                    context.startActivity(intent)
                }
    
    
            }
    
        }
    
    
        override fun getItemCount(): Int {
            return list.size
        }
    
    
        class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)
    }

【问题讨论】:

  • 崩溃通常会在调试器中显示某种错误消息。那么错误是什么?
  • Logcat 和适配器类添加在代码中作为注释提到的问题和错误行中。
  • 嗯,错误说得很清楚:当您尝试访问时,您的属性binding 未初始化...
  • 您能告诉我如何解决吗?我是初学者。

标签: kotlin android-recyclerview spinner android-adapter android-viewbinding


【解决方案1】:

发生崩溃,因为绑定未初始化。更改 ViewHolder 构造函数:

class MyViewHolder(private val binding : OrderStatusLayoutBinding) : RecyclerView.ViewHolder(binding.root)
 

还要更改 onCreateViewHolder 方法

 return ViewHolder(OrderStatusLayoutBinding.inflate(LayoutInflater.from(parent.context), parent,false))

【讨论】:

  • 我注释掉了最后一行代码并在那里添加了您的第一行代码并注释掉了override fun onCreateViewHolder 中的整个代码并添加了您的第二行代码。 Logcat 中的错误是 Cannot create an instance of an abstract classType mismatch: inferred type is OrderStatusLayoutBinding but View was expected。然后我将`return ViewHolder`重命名为return MyViewHolder,然后错误就消失了。但是当我点击按钮时,应用程序仍然像以前一样崩溃,并且 Logcat 错误与我的问题中提到的一样。
  • 在 MyViewHolder 类前面添加 inner 并尝试运行它。内部类 MyViewHolder
  • 我按照您所说的进行了更改,但错误与我的问题相同。在对我的初始代码进行所有这些更改后,它指向相同的代码行。
【解决方案2】:

kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized

表示您在 binding 属性被初始化之前尝试使用它。

binding 应该在你定义布局的地方声明;这通常是在onCreateViewHolder() 回调中,您在其中定义了默认充气器而不使用数据绑定,以解决该问题:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

    val inflater = LayoutInflater.from(parent.context)

    // initialize the binding either use:
    binding = DataBindingUtil.inflate(inflater, R.layout.order_status_layout, parent, false) 
    // or use:
    // binding = OrderStatusLayoutBinding.inflate(inflater)

    return MyViewHolder(binding)
}

第二个问题:您在MyViewHolder 中接受View 作为构造函数参数,而它应该接受OrderStatusLayoutBinding 的项目绑定类型

class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)

解决这个问题:

class MyViewHolder(binding: OrderStatusLayoutBinding) : RecyclerView.ViewHolder(binding.root)

更新

我收到了error Unresolved reference: DataBindingUtil alsoDataBindingUtil and inflater in binding = DataBindingUtil.inflate(inflater, R.layout.order_status_layout, parent, false) are red.

您需要在 build.gradle(模块级别)中启用 dataBinding,这需要有 kotlin-kapt 插件:

plugins {
    …
    id 'kotlin-kapt'
}
android {
    …
    buildFeatures {
        dataBinding true
    }
}

【讨论】:

  • 我得到了错误Unresolved reference: DataBindingUtil 还有DataBindingUtilbinding = DataBindingUtil.inflate(inflater, R.layout.order_status_layout, parent, false) 中的inflater 是红色的。
  • 请改用这个 binding = OrderStatusLayoutBinding.inflate(inflater)
  • Logcat, 'Unresolved reference: inflater' 和括号中的inflater 也是红色的。
  • 这就是我的onCreateViewHolder 现在的样子。覆盖乐趣 onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { binding = OrderStatusLayoutBinding.inflate(inflater) return MyViewHolder(binding) }
  • 您确定在 build.gradle 中启用了绑定库吗?
猜你喜欢
  • 1970-01-01
  • 2016-08-25
  • 2023-03-14
  • 2019-12-26
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多