Change text color of only selected item on RecyclerView android Kotlin

Viewed 2303
class CustomeAdapterForTopics(
    val ctx: Context,
    var clickListener: OnTopicClick,
    val items: ArrayList<ModelForTopics>
) : RecyclerView.Adapter<TopicViewHolder>() {

    override fun onBindViewHolder(holder: TopicViewHolder, position: Int) {

        val user: ModelForTopics = items[position]
        holder.textViewName.text = user.name
        holder.initilise(items.get(position), clickListener)

//        if() {
//            holder.textViewName.setTextColor(Color.parseColor("#FFA07A"));
//
//
//        } else {
//            holder.textViewName.setTextColor(Color.parseColor("#FFBA5F")); 
//
//        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopicViewHolder {
        val v = LayoutInflater.from(parent?.context).inflate(R.layout.topics_row, parent, false)
        return TopicViewHolder(v)
    }

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


}


class TopicViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    //    var itemViewList: List<View> = ArrayList()
    val textViewName = itemView.findViewById(R.id.textView) as TextView
//    itemViewList.add(itemView);
    fun initilise(items: ModelForTopics, action: OnTopicClick) {
        textViewName.text = items.name
//        textViewName.setTextColor(Color.parseColor("#25375F"))

        itemView.setOnClickListener {
            action.onItemClick(items, adapterPosition)
//            textViewName.setTextColor(Color.parseColor("#FFBA5F"))
//            if() {
//                textViewName.setTextColor(Color.parseColor("#FFBA5F"))
//            }
//            else{
//                textViewName.setTextColor(Color.parseColor("#25375F"))
//            }

        }

    }
}

interface OnTopicClick {
    fun onItemClick(items: ModelForTopics, position: Int)
}

I want to change the color for selected item which is shown through recyclerView. I just don't get the position of selected item. I just saw the solution on internet but didn't get it, or they are mostly of java code. Im new on development. Just let me find the exact position of clicked item so i can put condition in if else function

3 Answers
class ModelForTopics() {
    // ...
    var isSelected: Boolean = false
}

class CustomeAdapterForTopics(
    var clickListener: OnTopicClick,
    private val items: List<ModelForTopics>
) : RecyclerView.Adapter<TopicViewHolder>() {
    var selectedItemIndex = -1

    override fun onBindViewHolder(holder: TopicViewHolder, position: Int) {
        val item = items[position]
        holder.textViewName.text = item.name
        if (item.isSelected) {
            holder.textViewName.setTextColor(Color.parseColor("#FFBA5F"))
        } else {
            holder.textViewName.setTextColor(Color.parseColor("#25375F"))
        }
        holder.itemView.setOnClickListener {
            clickListener.onItemClick(item, position)
            item.isSelected = true
            if (selectedItemIndex != -1)
                items[selectedItemIndex].isSelected = false
            selectedItemIndex = position
            notifyDataSetChanged()
        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopicViewHolder =
        with(LayoutInflater.from(parent.context).inflate(R.layout.topics_row, parent, false)) {
            TopicViewHolder(this)
        }

    override fun getItemCount() = items.size
}


class TopicViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val textViewName: TextView = itemView.findViewById(R.id.textView)
}

This might help you

class MyClassesAdapter(
private val btnNames: List<String>,
private val listener: OnItemClickListener
) : RecyclerView.Adapter<MyClassesAdapter.MyClassViewHolder>() {

private var selectedPos = -1
private var prevSelectedPos = -1
private lateinit var context: Context

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyClassViewHolder {

    context = parent.context

    val binding = RvItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return MyClassViewHolder(binding)
}

override fun onBindViewHolder(holder: MyClassViewHolder, position: Int) {
    holder.bind(btnNames[position])
    holder.selectedOption(selectedPos, position)
}

override fun getItemCount(): Int {
    return if (btnNames.isEmpty()) 0
    else
        btnNames.size
}

inner class MyClassViewHolder(private val binding: RvItemBinding) :
    RecyclerView.ViewHolder(binding.root), View.OnClickListener {
    fun bind(btnText: String) {
        binding.btnItem.text = btnText
    }
    init {
        binding.btnItem.setOnClickListener(this)
    }

    override fun onClick(v: View?) {

        if (selectedPos >= 0) {
            notifyItemChanged(selectedPos)
        }
        selectedPos = adapterPosition
        notifyItemChanged(selectedPos)

        listener.onClassItemClick(adapterPosition, btnNames)
    }

    fun selectedOption(selectedPos: Int, position: Int) {

        if (position == prevSelectedPos) {
            binding.btnItem.background.setTint(ContextCompat.getColor(context, R.color.grey))
            binding.btnItem.setTextColor(ContextCompat.getColor(context, R.color.black))
            prevSelectedPos = -1
            return
        }

        if (selectedPos == position) {
            binding.btnItem.background.setTint(ContextCompat.getColor(context, R.color.sky_blue))
            binding.btnItem.setTextColor(ContextCompat.getColor(context, R.color.white))
            prevSelectedPos = position
        } else {
            binding.btnItem.background.setTint(ContextCompat.getColor(context, R.color.grey))
            binding.btnItem.setTextColor(ContextCompat.getColor(context, R.color.black))
        }
    }
}

    interface OnItemClickListener {
        fun onClassItemClick(pos: Int, btns: List<String>)
    }

}

You need to add isSelected field to ModelForTopics.

class ModelForTopics {
    ...
    public boolean isSelected = false;
}

Then you need to add this code

class TopicViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    //    var itemViewList: List<View> = ArrayList()
        val textViewName = itemView.findViewById(R.id.textView) as TextView
    //    itemViewList.add(itemView);
        fun initilise(items: ModelForTopics, action: OnTopicClick) {
            textViewName.text = items.name

            if(items.isSelected) {
                textViewName.setTextColor(Color.parseColor("#FFBA5F"))
            } else {
                textViewName.setTextColor(Color.parseColor("#25375F"))
            }

            itemView.setOnClickListener {
                action.onItemClick(items, adapterPosition)
                item.isSelected = !item.isSelected
                notifyDataSetChanged()
            }

        }
    }
Related