首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用按钮单击删除RecyclerView和Dao中的项目

使用按钮单击删除RecyclerView和Dao中的项目
EN

Stack Overflow用户
提问于 2021-06-18 01:24:48
回答 1查看 45关注 0票数 0

我有一个显示来自Dao的数据的RecyclerView。在recyclerView中显示的数据中有一个用来删除项目的按钮。

我知道它的功能是:

代码语言:javascript
复制
fun deleteReceipt(receipts: Receipts) = viewModelScope.launch {
    receiptDao.delete(receipts)
}

但我不太确定该把它放在哪里并调用它。因为如果要在设置其他显示项值的Adapter中调用它,则无法访问Dao

以下是代码片段:

代码语言:javascript
复制
@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)

    val exampleAdapter = ExampleAdapter()

    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){ /// New Items get passed to the List
        exampleAdapter.submitList(it)
    }
}
}

ViewModel:

代码语言:javascript
复制
@HiltViewModel
class PurchaseViewmodel @Inject constructor(
private val receiptDao: ReceiptDao
    ): ViewModel() {
private val tasksEventChannel = Channel<TasksEvent>()
val addTaskEvent = tasksEventChannel.receiveAsFlow()
        val receipts = receiptDao.getAllReceipts().asLiveData()

fun onAddResult(result: Int){
    when (result){
        ADD_RECEIPT_RESULT_OK ->showReceiptSavedConfirmation("Receipt is saved")
    }
}
private fun showReceiptSavedConfirmation (text: String) = viewModelScope.launch {
    tasksEventChannel.send(TasksEvent.ShowReceiptSavedConfirmation(text))
}

fun deleteReceipt(receipts: Receipts) = viewModelScope.launch {
    receiptDao.delete(receipts)
}

sealed class TasksEvent {
    data class ShowReceiptSavedConfirmation(val msg: String) : TasksEvent()
}
}

和适配器:

代码语言:javascript
复制
class ExampleAdapter : ListAdapter<Receipts,ExampleAdapter.ExampleViewHolder>(DiffCallback()) {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder { // Basically how to get a new Item from the List and display it
    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)
}

override fun getItemCount(): Int {
    return super.getItemCount()
}

class ExampleViewHolder(private val binding: ReceiptsBinding) : RecyclerView.ViewHolder(binding.root){ //Examples One Row in our list
    fun bind (receipts: Receipts) {
        binding.apply {
            storeHistory.text = receipts.store
            amountHistory.text = receipts.total
            dateHistory.text  = receipts.date
        }
    }
}
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
}
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-18 01:59:42

使用此方法创建侦听器适配器中的listener in Fragment

  • Create listener变量将侦听器从片段传递到适配器Interface

  • Implement将侦听器传递到viewHolder

  • on删除按钮单击该项调用listener方法,这将触发片段中的实现,您可以使用viewModel.deleteReceipt

访问ViewModel

  • delete
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68023959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档