Reputation: 4078
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
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:
<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
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