Shubham Tater
Shubham Tater

Reputation: 4078

how to get Checkbox isChecked data from recyclerview in Kotlin

I want to get isChecked data from checkbox from recycler view in this I am using Binding Adapter but I am not getting how to do that. If anyone has a way to do that then please share it.

    class ItemListAdapter(private val itemDeleteListener: ItemDeleteListener,
private val checkItemListener: CheckItemListener) :
    ListAdapter<ListItemTable, ItemListAdapter.ViewHolder>(ListItemDiffCallBack()) {

    class ViewHolder(private val binding: ShowItemBinding) : RecyclerView.ViewHolder(binding.root) {

        fun bind(listItemTable: ListItemTable, itemDeleteListener: ItemDeleteListener,
                 checkItemListener: CheckItemListener) {
            binding.itemHistory = listItemTable
            binding.itemDelete = itemDeleteListener
            binding.checkItem = checkItemListener

            binding.executePendingBindings()
        }

        companion object {
            fun from(parent: ViewGroup): ViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val binding = ShowItemBinding.inflate(layoutInflater, parent, false)
                return ViewHolder(binding)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.from(parent)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position), itemDeleteListener, checkItemListener)

        getItem(position).itemCompleted
    }

    class ItemDeleteListener(val clickListener: (listId: Long) -> Unit) {
        fun onClick(listItemTable: ListItemTable) = clickListener(listItemTable.itemId)
    }

    class CheckItemListener(val clickListener: (listId: Long) -> Unit){
        fun onClick(listItemTable: ListItemTable) = clickListener(listItemTable.itemId)
    }

    class ListItemDiffCallBack : DiffUtil.ItemCallback<ListItemTable>() {
        override fun areItemsTheSame(oldItem: ListItemTable, newItem: ListItemTable): Boolean {
            return oldItem.itemId == newItem.itemId
        }

        override fun areContentsTheSame(oldItem: ListItemTable, newItem: ListItemTable): Boolean {
            return oldItem == newItem
        }
    }
}

Upvotes: 0

Views: 331

Answers (2)

A. Patrik
A. Patrik

Reputation: 1692

See: https://developer.android.com/topic/libraries/data-binding/two-way

If you're using data binding I think you should take a look at two-way data binding. It's even introduced through this checkbox problem inside the docs, so you're in luck!

Edit: To be a bit more specific you would implement this like so:

Create a binding adapter that sets the property on the view

<layout>
<data>
  <variable
    name="itemHistory"
    type="your.package.ListItemTable" />
  <variable
    name="checkItem"
    type="android.widget.CompoundButton.OnCheckedChangeListener" />
  <!-...->
</data>
<CheckBox
    android:id="@+id/rememberMeCheckBox"
    android:checked="@{itemHistory.itemCompleted}"
    android:onCheckedChanged="@{checkItem}"
/>
</layout>

So you have to use OnCheckedChangeListener instead of your own listener, and pass that to your xml.

Upvotes: 1

cutiko
cutiko

Reputation: 10527

You already have 2 "listeners" on your constructor of the adapter and you are passing them to the view holder by using the bind method.

class ItemListAdapter(private val itemDeleteListener: ItemDeleteListener, private val checkItemListener: CheckItemListener)

So you have to pass the correct one to your view holder and then set the checkbox listener. Is better to use the constructor of the view holder to avoid passing the same listener on every binding

class ViewHolder(private val binding: ShowItemBinding, private val itemDeleteListener: ItemDeleteListener, private val checkItemListener: CheckItemListener) { 

    fun bind(listItemTable: ListItemTable) {

            binding.YOUR_CHECKBOX.setOnCheckedChangeListener(null) 
           
            binding.itemHistory = listItemTable
            binding.itemDelete = itemDeleteListener
            binding.checkItem = checkItemListener

            binding.executePendingBindings()
            
            binding.YOUR_CHECKBOX.setOnCheckedChangeListener { -, isChecked ->  
                //here call your "listener" by example
                checkItemListener.theMethod(isChecked)
            }
        }

}

We set the checkbox listener to null first so we can stop listening and then set the view values, otherwise, anything changing the view will also trigger the listener, once the view values are set, then set the checkbox listener to trigger the callbacks.

Upvotes: 0

Related Questions