【问题标题】:Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter convertView指定为非空的参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数convertView
【发布时间】:2019-05-16 14:40:53
【问题描述】:

在将适配器代码转换为 Kotlin 后出现此错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter convertView
    at ...MyAdapter.getView(Unknown Source:35)
    at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
    at android.widget.AbsListView.obtainView(AbsListView.java:2366)

膨胀行时触发错误:

class LegalAdapter internal constructor(private val activity: Activity, private val list: ArrayList<Item>) : BaseAdapter() {

    override fun getView(position: Int, convertView: View, parent: ViewGroup): View {

    val layoutInflater = activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

    @SuppressLint("ViewHolder")
    val row = layoutInflater.inflate(R.layout.legal_list_item, parent, false) //exception is throw here

显然,一些不应该为空的参数是空的,kotlin 会检查它。问题是我什至无法调试新的 kotlin 代码。

【问题讨论】:

    标签: android kotlin adaptor


    【解决方案1】:

    getView() 方法是Adapter 接口的一部分,在 Java 中定义。 Documentation here。重要的部分是关于convertView 参数的注释:

    视图:如果可能的话,要重用的旧视图。注意:在使用之前,您应该检查此视图是否为非空且类型合适。

    这意味着框架将 convertViewnull 值传递给此方法是非常有效的(这意味着您需要创建一个新视图并将其返回,而不是回收旧视图)。

    反过来,这意味着 convertView 的 Kotlin 定义必须是 View? 类型,而不仅仅是 View。因此,将您的函数签名更改为:

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View
    

    【讨论】:

    • 工具自动生成的签名。但是,是的,正是如此。此外,它解决了调试器的问题。现在它再次在方法内的断点处停止。
    • 哇!我会哭几个小时试图弄清楚这件事。谢谢!
    【解决方案2】:

    使convertView 可以为空:

    convertView: View?
    

    我不确定为什么行号错误,但堆栈跟踪会告诉您在哪里查看错误消息。

    【讨论】:

      【解决方案3】:

      将 getView 中的 convertView 从非 null 更改为可为 null

      override fun getView(position: Int, convertView: View, parent: ViewGroup): View {
      

      override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
      

      【讨论】:

        【解决方案4】:

        上面已经发布了所有正确的解决方案。再加上一些代码和 ViewBinding:

        class SpinnerAdapter(
              context: Context,
              private val items: List<YourModel>
        ) : BaseAdapter() {
        
        private var layoutInflater: LayoutInflater = LayoutInflater.from(context)
        
        override fun getView(i: Int, convertView: View?, viewGroup: ViewGroup): View {
            return if (convertView != null) {
                convertView
            } else {
                val view = layoutInflater.inflate(R.layout.item_spinner, null)
                val binding = ItemSpinnerBinding.bind(view)
                val item = items[i]
                binding.name.text = item.name
                view
            }
        }
        
        //more overridde methods
        }
        

        我的 R.layout.item_spinner 有一个 TextView,其 ID 名为“名称”。

        【讨论】:

          猜你喜欢
          • 2018-05-30
          • 2019-06-03
          • 2020-07-26
          • 2022-10-07
          • 2017-12-06
          • 1970-01-01
          相关资源
          最近更新 更多