繁体   English   中英

我无法使用房间数据库和协程删除 recyclerview 中的项目

[英]I can't delete item in recyclerview using room database and coroutines

我是 android 喷气背包组件的新手,但作为学习者,我想制作一个笔记应用程序,在这个应用程序中,我使用的是房间数据库和协程。 它已成功插入,更新但我无法删除。 这是我的代码,可能很长 ShowFragment

class ShowFragment : BaseFragment(),onItemClickListener {
private var customerNote:Customer? = null
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_show, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    recyclerView.setHasFixedSize(true)
    recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)

    launch {
        context?.let {
            val c = CustomerDatabase(it).getNoteDao().getAllNote()
            recyclerView.adapter = ShowAdapter(c as ArrayList<Customer>,this@ShowFragment)
            it.toast("Show!")

        }
    }

    add_button.setOnClickListener {
        val action = ShowFragmentDirections.actionAddNote()
        Navigation.findNavController(it).navigate(action)
    }
}

override fun onClick(item: Customer, position: Int) {
    launch {
                context?.let {
                    CustomerDatabase(it).getNoteDao().noteDelete(customerNote!!)
                    it.toast("Deleted!")
                }
    }
}

基本片段

abstract class BaseFragment:Fragment(),CoroutineScope {
private lateinit var job:Job

override val coroutineContext: CoroutineContext
    get() = job + Dispatchers.Main

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    job = Job()
}

override fun onDestroy() {
    super.onDestroy()
    job.cancel()
}

显示适配器

class ShowAdapter(private val customerList:ArrayList<Customer>,private val onItemClickListener: onItemClickListener):RecyclerView.Adapter<ShowAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ShowAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.note_row,parent,false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ShowAdapter.ViewHolder, position: Int) {
        holder.itemView.emName.text = customerList[position].name
        holder.itemView.emPosition.text = customerList[position].position
        holder.itemView.emAddress.text = customerList[position].address
        holder.itemView.emPhone.text = customerList[position].phone


        holder.itemView.emUpdate.setOnClickListener {
            val action = ShowFragmentDirections.actionAddNote()
            action.customer = customerList[position]
            Navigation.findNavController(it).navigate(action)
        }

        holder.itemView.emDelete.setOnClickListener {
            onItemClickListener.onClick(customerList[position],position)
        }

    }


    override fun getItemCount(): Int {
        return customerList.size
    }

    class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) {
}

错误

我该如何解决这个问题,请帮助我

在您的ShowFragment中,您通过传递错误的 null object 来调用noteDelete

所以尝试以下

override fun onClick(item: Customer, position: Int) {
    launch {
                context?.let {
                    CustomerDatabase(it).getNoteDao().noteDelete(item)
                    val c = CustomerDatabase(it).getNoteDao().getAllNote()
                    (recyclerView.adapter as ShowAdapter).addNewList(c)
                }
    }
//add this function in your adapter

 fun addnewList(newCustomerList:ArrayList<Customer>){
     customerList = newCustomewList
     notifyDataSetChanged()
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM