29

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

4 回答 4

49

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

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

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

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

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View
于 2018-12-15T16:01:27.197 回答
17

使convertView可空:

convertView: View?

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

于 2018-12-15T15:50:20.287 回答
7

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

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

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
于 2019-09-07T13:24:35.553 回答
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 的 TextView。

于 2020-03-29T13:40:26.267 回答