点击按钮删除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
相关产品推荐
相关产品推荐

