Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

current item Position in RecyclerView with interface Android

Here I am not getting my current clicked item position. It some time shows incorrect position and some time make crash.
My Adapter Code is as below.

Some time I clicked in 1st position it will work fine. But I clicked again at any position from the item it shows it’s previous item.

Thanks in advance for your answer or suggestions.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

class MyAdapter(private val mList: ArrayList<MyModel>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    private lateinit var mListener: OnItemClickListener

    interface OnItemClickListener : AdapterView.OnItemClickListener {
        fun onItemClick(position: Int)
    }

    fun setOnItemClickListener(listener: OnItemClickListener) {
        mListener = mListener
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_all_brands, parent, false)
        return ViewHolder(view, mListener)
    }


    @SuppressLint("SetTextI18n")
    @RequiresApi(Build.VERSION_CODES.N)
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.ivBrandImage.setImageResource(mList[position].image)
        holder.tvBrandName.text = mList[position].name

        holder.tvBrandName.isSelected = true
        holder.tvBrandName.setSingleLine()

    }


    override fun getItemId(position: Int): Long {
        return position.toLong()
    }


    override fun getItemCount(): Int {
        return mList.size
    }

    class ViewHolder(ItemView: View, listener: OnItemClickListener) :
        RecyclerView.ViewHolder(ItemView) {
        val ivBrandImage: ImageView = itemView.findViewById(R.id.ivBrandImage)
        val tvBrandName: TextView = itemView.findViewById(R.id.tvBrandName)

        init {
            itemView.setOnClickListener {
                listener.onItemClick(adapterPosition)
            }
        }

    }

}

>Solution :

There is one mistake you do in the setOnItemClickListener Method.

Remove :

 fun setOnItemClickListener(listener: OnItemClickListener) {
    mListener = mListener
 }

Replace :

fun setOnItemClickListener(listener: OnItemClickListener) {
    mListener = listener
}

So your total code should look like

class MyAdapter(private val mList: ArrayList<MyModel>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    private lateinit var mListener: OnItemClickListener

    interface OnItemClickListener : AdapterView.OnItemClickListener {
        fun onItemClick(position: Int)
    }

    fun setOnItemClickListener(listener: OnItemClickListener) {
        mListener = listener
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_all_brands, parent, false)
        return ViewHolder(view, mListener)
    }


    @SuppressLint("SetTextI18n")
    @RequiresApi(Build.VERSION_CODES.N)
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.ivBrandImage.setImageResource(mList[position].image)
        holder.tvBrandName.text = mList[position].name

        holder.tvBrandName.isSelected = true
        holder.tvBrandName.setSingleLine()

    }


    override fun getItemId(position: Int): Long {
        return position.toLong()
    }


    override fun getItemCount(): Int {
        return mList.size
    }

    class ViewHolder(ItemView: View, listener: OnItemClickListener) :
        RecyclerView.ViewHolder(ItemView) {
        val ivBrandImage: ImageView = itemView.findViewById(R.id.ivBrandImage)
        val tvBrandName: TextView = itemView.findViewById(R.id.tvBrandName)

        init {
            itemView.setOnClickListener {
                listener.onItemClick(adapterPosition)
            }
        }

    }

}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading