Nebula Shade
Nebula Shade

Reputation: 77

RecyclerView OnClickListener Error NullParameter

I have converted my app from Java to Kotlin. I've been using RecyclerView, it worked on Java version. But when I converted this app to Kotlin I got an error whenever I tried to click the item on my recycler view. I don't know what's wrong with my code, I have put null safe operator (?) but the error still occurs. This is my adapter:

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
    }


}

and this is how do I use on my fragment:

 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)

the error is come from this line: onNumberListener?.onNumberClick(adapterPosition) and this line: customDialog?.show()

Error Log:

  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)

Any suggestions?

Upvotes: 0

Views: 63

Answers (1)

laalto
laalto

Reputation: 152927

In your CustomDialog.onCreate(), the savedInstanceState: Bundle parameter should be nullable savedInstanceState: Bundle?.

Upvotes: 2

Related Questions