android - 我无法使用房间数据库和协程删除 recyclerview 中的项目
问题描述
我是 android jetpack 组件的新手,但作为一名学习者,我想制作一个笔记应用程序,在这个应用程序中,我使用的是房间数据库和协程。它已成功插入,更新但我无法删除。这是我的代码,可能很长 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
中,您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()
}
推荐阅读
- javascript - 过滤盒插件
- node.js - res.write() 正在发送连接的数据
- selenium - 如何上传图像机器人框架?
- mysql - Moodle 选择脚本为用户显示不正确的角色
- angular - 创建接口时是否有 Angular 组件的类型?
- java - 如何在JAVA中放心api的请求正文中传递参数?
- spring - Spring OAuth2,成功登录后在查询参数中返回刷新令牌是否安全?
- javascript - 选择选项卡中的所有声音以调整它们
- javascript - CORS 问题 - CORS 策略阻止了从 *** 从源 *** 获取的访问权限:没有“Access-Control-Allow-Origin” - 向 Firebase 发送请求
- spring-boot - 我想向“www.something.com”等外部服务器提交帖子表单,例如 localhost。我可以用百里香做吗..?