I have recyclerView which is having multiple items. Every item is holding a checkbox to select that item. I want to get the selected item in another ArrayList and pass it to my MainActivity. On accept click I called getselecteditem() but getselecteditem() function always returns null. Here is my adapter code.
JavaScript
x
class orderAdapter(val items: List<Orders>, val context: Context) :
RecyclerView.Adapter<ViewHolder>() {
var selectedItems: ArrayList<String> = ArrayList()
var selectedList: ArrayList<String> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(context).inflate(
R.layout.order_queue_item,
parent,
false
)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.tvQuantity?.text = "Quantity: ${items.get(position).totalCount}"
holder.tvOrderId?.text = "Order No. : ${items.get(position).orderNumber}"
holder.tvSum?.text = "Sum: ${items.get(position).totalPrice}"
/* holder.cbSelectOrder?.setOnClickListener(object : View.OnClickListener{
override fun onClick(v: View?) {
selectedItems.add(items.get(position))
Log.e("selected"," "+selectedItems.size)
}
})*/
holder.cbSelectOrder.setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked) {
selectedList.add(items.get(position).id)
Log.e("selected", "items " + items.get(position).id)
Log.e("selected", "selected " + selectedList.size)
Log.e("selected", "selected " + selectedList.toString())
//var size = selectedItems.size
// selectedList.addAll(selectedItems)
notifyDataSetChanged()
} else if(!isChecked) {
selectedList.remove(items.get(position).id)
Log.e("selected", "items " + items.get(position).id)
Log.e("selected", "selected " + selectedList.size)
Log.e("selected", "selected " + selectedList.toString())
notifyDataSetChanged()
}
notifyDataSetChanged()
}
holder.btnView?.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
val intent = Intent(context, ReviewOrderActivity::class.java)
intent.putExtra("orderId", items.get(position).id.toString())
context.startActivity(intent) // put context infront
}
})
}
fun getSelected(): ArrayList<String> {
Log.e("selected", "selectedlist " + selectedList.size)
Log.e("selected", "selectedlist " + selectedList.toString())
return selectedList
}
override fun getItemCount(): Int {
return items.size
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
// Holds the TextView that will add each animal to
val tvQuantity = view.findViewById<TextView>(R.id.tv_quantity)
val tvOrderId = view.findViewById<TextView>(R.id.tv_order_id)
val tvSum = view.findViewById<TextView>(R.id.tv_sum)
val btnView = view.findViewById<Button>(R.id.btn_view)
val cbSelectOrder = view.findViewById<CheckBox>(R.id.cb_button)
}
Advertisement
Answer
- You need a callback which lets to fetch selected order and update list on every selected or un-select order
JavaScript
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
.
public interface Listener {
fun getSelectedOrderList(list : ArrayList<String>);
}
}
orderAdapter
constructor will have listener instance which will update selected list in main activity.
JavaScript
class orderAdapter(val items: List<Orders>, val context: Context, private val listener: ViewHolder.Listener)
- In MainActivity recyclerview listener will get list.
JavaScript
recyclerView.adapter = orderAdapter(getOrderList(), this, object : ViewHolder.Listener {
override fun getSelectedOrderList(list: ArrayList<String>) {
Log.d(TAG, "Selected order List : $list")
}
})
orderAdapter class
JavaScript
class orderAdapter(val items: List<Orders>, val context: Context, private val listener: ViewHolder.Listener) :
RecyclerView.Adapter<ViewHolder>() {
var selectedItems: ArrayList<String> = ArrayList()
var selectedList: ArrayList<String> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(context).inflate(R.layout.order_queue_item, parent, false)
)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.tvQuantity.text = "Quantity: ${items.get(position).totalCount}"
holder.tvOrderId?.text = "Order No. : ${items.get(position).orderNumber}"
holder.tvSum?.text = "Sum: ${items.get(position).totalPrice}"
holder.cbSelectOrder.setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked) {
selectedList.add(items.get(position).id)
notifyDataSetChanged()
} else if (!isChecked) {
selectedList.remove(items.get(position).id)
notifyDataSetChanged()
}
listener.getSelectedOrderList(selectedList)
notifyDataSetChanged()
}
holder.btnView.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
Toast.makeText(context, "View Button Clicked", Toast.LENGTH_SHORT).show()
}
})
}
fun getSelected(): ArrayList<String> {
return selectedList
}
override fun getItemCount(): Int {
return items.size
}
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
// Holds the TextView that will add each animal to
val tvQuantity = view.findViewById<TextView>(R.id.tv_quantity)
val tvOrderId = view.findViewById<TextView>(R.id.tv_order_id)
val tvSum = view.findViewById<TextView>(R.id.tv_sum)
val btnView = view.findViewById<Button>(R.id.btn_view)
val cbSelectOrder = view.findViewById<CheckBox>(R.id.cb_button)
public interface Listener {
fun getSelectedOrderList(list : ArrayList<String>);
}
}