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

点击按钮删除RecyclerView条目及对应Dao中存储数据的实现问题

你可以通过高阶函数回调的方式完成删除逻辑的透传,不需要让Adapter直接持有Dao或者ViewModel实例,具体修改步骤如下:

第一步:修改ExampleAdapter,新增删除事件回调

给Adapter构造函数添加删除回调参数,同时在ViewHolder中绑定删除按钮的点击事件:

// 构造函数新增回调参数
class ExampleAdapter(private val onItemDelete: (Receipts) -> Unit) : ListAdapter<Receipts,ExampleAdapter.ExampleViewHolder>(DiffCallback()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
        val binding = ReceiptsBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        return ExampleViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int) {
        val currentItem = getItem(position)
        holder.bind(currentItem)
    }

    inner class ExampleViewHolder(private val binding: ReceiptsBinding) : RecyclerView.ViewHolder(binding.root){
        fun bind (receipts: Receipts) {
            binding.apply {
                storeHistory.text = receipts.store
                amountHistory.text = receipts.total
                dateHistory.text  = receipts.date
                // 此处btnDelete替换为你列表项布局里删除按钮的实际id
                btnDelete.setOnClickListener {
                    // 点击时触发回调,把当前条目对象传出去
                    onItemDelete(receipts)
                }
            }
        }
    }

    class DiffCallback : DiffUtil.ItemCallback<Receipts>() {
        override fun areItemsTheSame(oldItem: Receipts, newItem: Receipts) =
            oldItem.id == newItem.id

        override fun areContentsTheSame(oldItem: Receipts, newItem: Receipts) =
            oldItem == newItem
    }
}

注意:把代码里的btnDelete替换为你自己ReceiptsBinding对应布局中删除按钮的ID

第二步:修改HistoryFragment,初始化Adapter时传入回调实现

在Fragment中创建Adapter实例时,实现回调逻辑,直接调用ViewModel的删除方法即可:

@AndroidEntryPoint
class HistoryFragment : Fragment(R.layout.fragment_history) {

    private val viewModel: PurchaseViewmodel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val binding = FragmentHistoryBinding.bind(view)
        // 初始化Adapter时传入回调实现
        val exampleAdapter = ExampleAdapter { receipt ->
            viewModel.deleteReceipt(receipt)
        }

        binding.apply{
            recyclerView.apply{
                layoutManager = LinearLayoutManager(requireContext())
                adapter = exampleAdapter
                setHasFixedSize(true)
            }
        }

        setFragmentResultListener("add_receipt_request"){_,bundle ->
            val result = bundle.getInt("add_receipt_request")
            viewModel.onAddResult(result)
        }

        viewModel.receipts.observe(viewLifecycleOwner){
            exampleAdapter.submitList(it)
        }
    }
}

逻辑说明

你ViewModel中的receipts是Dao返回的LiveData,当调用deleteReceipt删除数据后,LiveData会自动收到新的数据集,调用Adapter的submitList更新列表,不需要手动调用列表刷新方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 09:15:03