指定为非空的参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数convertView
Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter convertView
我刚将适配器代码转换为 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
显然,某些不应该为null的参数为null,kotlin对其进行了检查。问题是我什至无法调试新的 kotlin 代码。
使 convertView
可为空:
convertView: View?
我不确定行号为何错误,但堆栈跟踪告诉您在错误消息中查找的位置。
getView()
方法是 Adapter
接口的一部分,在 Java 中定义。 Documentation here。重要的部分是关于 convertView
参数的注释:
View: The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using.
这意味着框架将 convertView
的 null
值传递给此方法是非常有效的(这意味着您需要创建一个新视图,并且 return而不是回收旧视图)。
反过来,这意味着 convertView
的 Kotlin 定义必须是 View?
类型,而不仅仅是 View
。因此,将您的函数签名更改为:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View
将 getView 中的 convertView 从非空更改为可为空
override fun getView(position: Int, convertView: View, parent: ViewGroup): View {
至
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
上面已经发布了所有正确的解决方案。还有一些代码和 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 有一个名为 "name" 的 TextView。
我刚将适配器代码转换为 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
显然,某些不应该为null的参数为null,kotlin对其进行了检查。问题是我什至无法调试新的 kotlin 代码。
使 convertView
可为空:
convertView: View?
我不确定行号为何错误,但堆栈跟踪告诉您在错误消息中查找的位置。
getView()
方法是 Adapter
接口的一部分,在 Java 中定义。 Documentation here。重要的部分是关于 convertView
参数的注释:
View: The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using.
这意味着框架将 convertView
的 null
值传递给此方法是非常有效的(这意味着您需要创建一个新视图,并且 return而不是回收旧视图)。
反过来,这意味着 convertView
的 Kotlin 定义必须是 View?
类型,而不仅仅是 View
。因此,将您的函数签名更改为:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View
将 getView 中的 convertView 从非空更改为可为空
override fun getView(position: Int, convertView: View, parent: ViewGroup): View {
至
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
上面已经发布了所有正确的解决方案。还有一些代码和 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 有一个名为 "name" 的 TextView。