参数指定为非空,但为null:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull中的参数convertView。

33

将适配器代码转换为 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 代码。

4个回答

55
getView()方法是Adapter接口的一部分,在Java中定义。具体信息请参见此文档。重要的是这个关于convertView参数的注释:

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

这意味着框架很可能会向该方法传递null值的convertView(这意味着您需要创建一个新视图并返回它,而不是回收旧视图)。
因此,这意味着convertView的Kotlin定义必须是View?类型,而不仅仅是View。所以,请将函数签名更改为:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View

2
工具自动生成的签名。没错,就是这样。而且,它解决了调试器的问题。现在它又可以在方法内部的断点处停止了。 - MiguelSlv
哇!如果不是你,我会哭上几个小时都解决不了这个问题。谢谢! - JoeGalind
像魔法一样好用,谢谢。这是在将Java文件转换为Kotlin时发生的。如果您在创建此BaseAdapter时使用Kotlin,则无需检查此导入签名。 - Raj Kanchan

18

使 convertView 可为空:

convertView: View?

我不确定为什么行号是错误的,但堆栈跟踪会告诉您在错误消息中查找的位置。


8

将 getView 中的 convertView 从非空变为可空

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

to

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

0

所有正确的解决方案已经在上面发布了。这里再提供一个带有一些代码和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 中有一个 id 为 "name" 的 TextView。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接