You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment点击按钮时,如何从RecyclerView Adapter通过Bundle传递选中卡片数据

没问题,我帮你梳理下实现步骤,保证能搞定这个需求:

第一步:给数据模型和ViewHolder添加勾选状态支持

首先得让你的卡片数据能记录勾选状态,同时在ViewHolder里处理Checkbox的交互:

  • 给你的卡片实体类(比如叫CardItem)新增一个isChecked字段,用来标记是否被勾选:
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

// 实现Parcelable方便后续用Bundle传递数据
@Parcelize
data class CardItem(
    val id: Int,
    val title: String,
    val detail: String,
    var isChecked: Boolean = false // 新增勾选状态字段
) : Parcelable
  • 在RecyclerView的ViewHolder里绑定Checkbox,实时更新数据模型的勾选状态:
class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    private val checkbox: CheckBox = itemView.findViewById(R.id.card_checkbox)
    private val titleTv: TextView = itemView.findViewById(R.id.card_title)
    private val detailTv: TextView = itemView.findViewById(R.id.card_detail)

    fun bind(item: CardItem) {
        titleTv.text = item.title
        detailTv.text = item.detail
        checkbox.isChecked = item.isChecked

        // 监听勾选变化,同步更新数据模型
        checkbox.setOnCheckedChangeListener { _, isChecked ->
            item.isChecked = isChecked
        }
    }
}
第二步:在Fragment中维护RecyclerView的数据源

你需要在Fragment里持有一个可变的数据源列表,这样才能实时获取最新的勾选状态:

  • 初始化Adapter和RecyclerView:
class CardListFragment : Fragment() {
    private lateinit var adapter: CardAdapter
    // 用可变列表存卡片数据,方便更新勾选状态
    private val cardItems = mutableListOf<CardItem>().apply {
        // 这里替换成你的实际初始化数据
        add(CardItem(1, "卡片1", "这是卡片1的详情"))
        add(CardItem(2, "卡片2", "这是卡片2的详情"))
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(requireContext())
        adapter = CardAdapter(cardItems)
        recyclerView.adapter = adapter
    }

    // Adapter内部类
    inner class CardAdapter(private val itemList: MutableList<CardItem>) : RecyclerView.Adapter<CardViewHolder>() {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.item_card, parent, false)
            return CardViewHolder(view)
        }

        override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
            holder.bind(itemList[position])
        }

        override fun getItemCount() = itemList.size
    }
}
第三步:处理底部按钮点击,筛选勾选卡片并传递数据

找到底部按钮,设置点击监听,筛选出已勾选的条目,再通过Bundle传到下一个Fragment:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // ... 前面的RecyclerView初始化代码

    val bottomBtn = view.findViewById<Button>(R.id.bottom_button)
    bottomBtn.setOnClickListener {
        // 筛选出所有已勾选的卡片
        val selectedCards = cardItems.filter { it.isChecked }
        
        if (selectedCards.isEmpty()) {
            // 提示用户没勾选任何卡片
            Toast.makeText(requireContext(), "请至少勾选一个卡片哦", Toast.LENGTH_SHORT).show()
            return@setOnClickListener
        }

        // 准备Bundle传递数据
        val bundle = Bundle()
        bundle.putParcelableArrayList("selected_cards", ArrayList(selectedCards))

        // 跳转到下一个Fragment
        val nextFragment = SelectedCardsFragment()
        nextFragment.arguments = bundle
        parentFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, nextFragment)
            .addToBackStack(null)
            .commit()
    }
}
第四步:在下一个Fragment中接收并处理数据

在目标Fragment里取出Bundle中的数据,就可以使用已勾选的卡片详情了:

class SelectedCardsFragment : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        arguments?.let { bundle ->
            val selectedCards = bundle.getParcelableArrayList<CardItem>("selected_cards")
            selectedCards?.forEach { card ->
                // 这里处理每个选中的卡片,比如打印日志或者展示到UI上
                Log.d("SelectedCards", "选中卡片:${card.title} - ${card.detail}")
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Satyam Gondhale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:33:44