![](/img/trans.png)
[英]How can Room database update my RecyclerView in the UI when I have added a new item to the database using Coroutines?
[英]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.