首页 > 解决方案 > 如何将多个选定项目从 Recyclerview 传递到 Activity?

问题描述

同一活动 rv1 和 rv2 中有两个 Recyclerview。rv1 的选中项将显示在 rv2 中

房车1:

在这里我选择了多个项目

房车2:

它应该像这样显示

rv1的适配器类:

class ServiceJobAdapter(val context: Context, var list:ArrayList<JobRespo>,var listener:OnItemClick):
RecyclerView.Adapter<ServiceJobAdapter.ItemsCarrier>(){
 var currentSelectedIndex= -1
 var selectedItem = SparseBooleanArray()
 var animationItemsIndex = SparseBooleanArray()
private val reverseAllAnimations = false
var holder:ItemsCarrier? =null
class ItemsCarrier(itemView: View) : RecyclerView.ViewHolder(itemView)
{
    var jobName = itemView.findViewById<TextView>(R.id.job_name)
    var jobPrice = itemView.findViewById<TextView>(R.id.job_price)
    var iconBack = itemView.findViewById(R.id.icon_back) as RelativeLayout
    var iconFront = itemView.findViewById(R.id.icon_front) as RelativeLayout
    var iconContainer = itemView.findViewById(R.id.icon_container) as CardView
    fun binde(jobRespo: JobRespo) {
        jobName.text = jobRespo.repDesc
        jobPrice.text="₹&quot;+jobRespo.repRice
        if (iconFront.visibility == View.VISIBLE)
        {
            jobRespo.setChecked(false)
        }else{
            jobRespo.setChecked(true)
        }
    }
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemsCarrier {
    val view = LayoutInflater.from(context).inflate(R.layout.job_row,parent,false)
    return ItemsCarrier(view)
}
override fun getItemCount(): Int {
    return list.size
}
override fun onBindViewHolder(holder: ItemsCarrier, position: Int) {
    this.holder = holder
    holder.itemView.isActivated = selectedItem[position,false]
    holder.binde(list[position])
    applyIconAnimation(holder, position)
    // apply click events
    applyClickEvents(holder, position)
}
private fun applyClickEvents(holder: ItemsCarrier, position: Int) {
    holder.iconContainer.setOnClickListener {
        listener.onIconClicked(position)
        listener.AllItem(list[position]) }
}
private fun applyIconAnimation(holder: ItemsCarrier, position: Int)
{
    if (selectedItem.get(position, false)) {
        holder.iconFront!!.visibility = View.GONE
        resetIconYAxis(holder.iconBack)
        holder.iconBack.visibility = View.VISIBLE
        holder.iconBack.alpha = 1f
        if (currentSelectedIndex == position) {
            FlipAnimator.flipView(context, holder.iconBack, holder.iconFront, true)
            resetCurrentIndex()
        }
    } else {
        holder.iconBack.visibility = View.GONE
        resetIconYAxis(holder.iconFront)
        holder.iconFront.visibility = View.VISIBLE
        holder.iconFront.alpha = 1f

        if (reverseAllAnimations && animationItemsIndex.get(
                position,
                false
            ) || currentSelectedIndex == position
        ) {
            FlipAnimator.flipView(context, holder.iconBack, holder.iconFront, false)
            resetCurrentIndex() } } }
private fun resetIconYAxis(view: RelativeLayout?)
{
    if (view!!.rotationY != 0f) {
        view.rotationY = 0f
    }
}
private fun resetCurrentIndex() {
    currentSelectedIndex = -1
}
fun toggleSelection(pos: Int) {
    currentSelectedIndex = pos
    if (selectedItem.get(pos, false)) {
        selectedItem.delete(pos)
        animationItemsIndex.delete(pos)
    } else {
        selectedItem.put(pos, true)
        animationItemsIndex.put(pos, true)
    }
    notifyItemChanged(pos)
}
fun getSelectedItems(): ArrayList<JobRespo>
{
    val selectItems = ArrayList<JobRespo>()
    for(item in list)
    {
        if (!item.isChecked())
        {
            selectItems.add(item)
        }
    }
    return selectItems}}

使用界面

interface OnItemClick{
fun onIconClicked(position: Int)
fun AllItem(jobs:JobRespo)}

在Activity中实现接口

  override fun onIconClicked(position: Int) {
    mAdapter!!.toggleSelection(position)
}
override fun AllItem(jobs: JobRespo) {
    val selectedItems:ArrayList<JobRespo>
                 =mAdapter!!.getSelectedItems()
    selectIte.addAll(selectedItems)
}

2nd Recyclerview 的适配器类:

lass SelectItemAdapter(val context: Context, var list:List<JobRespo>): RecyclerView.Adapter<SelectItemAdapter.ItemsCarriers>(){
class ItemsCarriers(itemView: View) : RecyclerView.ViewHolder(itemView) {
    var itemName = itemView.findViewById<TextView>(R.id.item_name)
    var itemPrice= itemView.findViewById<TextView>(R.id.item_peice)
    var itmDelet =itemView.findViewById<LinearLayout>(R.id.item_delete)
    fun bind(job: JobRespo) {
      itemName.text = job.repDesc
      itemPrice.text = job.repRice }
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemsCarriers {
    val root = LayoutInflater.from(context).inflate(R.layout.select_item_row,parent,false)
    return ItemsCarriers(root)
}
override fun getItemCount(): Int {
  return list.size
}
override fun onBindViewHolder(holder: ItemsCarriers, position: Int) {
   holder.bind(list[position])}}

现在我如何将多选数据从一个回收器视图传递到同一活动的另一个回收器视图?

感谢您的考虑并指导我:)

标签: androidandroid-recyclerview

解决方案


您可以在第二个适配器中创建一个方法来更新所选值,如下所示,并在您获取所选项目时使用它。

fun setSelectedData(data:ArrayList<JobRespo>){
 this.list.clear()
 this.list.addAll(data)
 notifyDataSetChanged ();
}

推荐阅读