首页 > 解决方案 > RecyclerView OnClickListener 报错 NullParameter

问题描述

我已将我的应用程序从 Java 转换为 Kotlin。我一直在使用 RecyclerView,它适用于 Java 版本。但是,当我将此应用程序转换为 Kotlin 时,每当我尝试单击回收站视图上的项目时都会出错。我不知道我的代码有什么问题,我已经放置了空安全运算符(?),但错误仍然存​​在。这是我的适配器:

class MenuListAdapter(context: Context, number: ArrayList<User>?, onNumberListener: OnNumberListener) : RecyclerView.Adapter<MenuListAdapter.ViewHolder>() {
    private var dataPointList: ArrayList<User>? = ArrayList<User>()
    private val mOnNumberListener: OnNumberListener?
    private val mContext: Context


    inner class ViewHolder(itemView: View, onNumberListener: OnNumberListener) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        val textPhone: TextView = itemView.findViewById<View>(R.id.TvPhone) as TextView
        private var onNumberListener: OnNumberListener = onNumberListener

        override fun onClick(view: View?) {
          onNumberListener?.onNumberClick(adapterPosition)
        }


        init {
            itemView.setOnClickListener(this)
        }
    }

    private val mInflater: LayoutInflater? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val inflater = LayoutInflater.from(mContext)
        val view: View = inflater.inflate(R.layout.list_data, parent, false)
        return ViewHolder(view, mOnNumberListener!!)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.textPhone.text = dataPointList!![position].phoneNumber
        /*
        holder.textPhone.setOnClickListener {
            Toast.makeText(mContext, "clicked", Toast.LENGTH_SHORT).show()

        }
         */


    }

    override fun getItemCount(): Int {
        return dataPointList?.size ?: -1
    }

    interface OnNumberListener {
        fun onNumberClick(numbers: Int?)
    }

    companion object {
        private val TAG = MenuListAdapter::class.java.simpleName
    }

    init {
        dataPointList = number
        mOnNumberListener = onNumberListener
        mContext = context
    }


}

这就是我如何在我的片段上使用:

 adapter = MenuListAdapter(this@MainActivity, dataPointList, object : MenuListAdapter.OnNumberListener {

            override fun onNumberClick(position: Int?) {

                val nomer = dataPointList[Integer.valueOf(position!!)].phoneNumber
                val mId = dataPointList[Integer.valueOf(position!!)].id
                val customDialog = CustomDialog(this@MainActivity, nomer, mId.toString())
                customDialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
                customDialog?.show()
            }
        })
        recyclerView.adapter = adapter
        recyclerView.setHasFixedSize(true)
        recyclerView.layoutManager = LinearLayoutManager(this)

错误来自这一行: onNumberListener?.onNumberClick(adapterPosition) 和这一行: customDialog?.show()

错误日志:

  java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter savedInstanceState
        at com.example.dmcall.dialog.CustomDialog.onCreate(Unknown Source:2)
        at android.app.Dialog.dispatchOnCreate(Dialog.java:561)
        at android.app.Dialog.show(Dialog.java:396)
        at com.example.dmcall.MainActivity$onCreate$1.onNumberClick(MainActivity.kt:66)
        at com.example.dmcall.MenuListAdapter$ViewHolder.onClick(MenuListAdapter.kt:27)
        at android.view.View.performClick(View.java:7339)
        at android.view.View.performClickInternal(View.java:7305)

有什么建议么?

标签: androidkotlinandroid-recyclerview

解决方案


在您的CustomDialog.onCreate()中,savedInstanceState: Bundle参数应该可以为空savedInstanceState: Bundle?


推荐阅读