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
相关产品推荐
相关产品推荐

