如何使用RecyClerview MVVM在房间数据库中删除记录

发布于 2025-01-21 04:19:36 字数 3129 浏览 4 评论 0原文

我需要删除应在房间数据库中通知的项目Recyclerview适配器,请帮助我找到解决方案,并提前

 class ListAdapter : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {
private lateinit var mitemsViewModel: ItemsViewModel
private var itemsList = emptyList<Item>()
private lateinit var item: Item
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    return MyViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.item_row_layout, parent, false)
    )
}
override fun getItemCount(): Int {
    return itemsList.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    item = itemsList.get(position)
    //always remember this technique to save the values in val type
    val currentItem = itemsList[position]
    holder.itemView.itemNameTV.text = currentItem.itemName.toString()
    holder.itemView.itemCodeTV.text = currentItem.itemCode.toString()
    holder.itemView.itemCategoryTV.text = currentItem.itemCategory.toString()
    holder.itemView.itemDescriptionTV.text = currentItem.itemDescription.toString()
    holder.itemView.itemSellingPriceTV.text = currentItem.itemSellingPrice.toString()
    holder.itemView.itemStockTV.text = currentItem.itemStock.toString()
    holder.itemView.deleteItem.setOnClickListener {
        val itName = holder.itemView.itemNameTV.text.toString()
        val itCode = holder.itemView.itemCodeTV.text.toString()
        val itCategory = holder.itemView.itemCategoryTV.text.toString()
        val itDescription = holder.itemView.itemDescriptionTV.text.toString()
        val itSellingPrice = holder.itemView.itemSellingPriceTV.text.toString()
        val itStock = holder.itemView.itemStockTV.text.toString()
        val itime = Item(0, itName, itCode, itCategory, itSellingPrice, itStock, itDescription)
        mitemsViewModel.deleteItem(itime)
        //dao.deleteItem(itemsList.get(position))
    }
}
fun setData(item: List<Item>) {
    this.itemsList = item
    notifyDataSetChanged()

}}

帮助我如何初始化RecyClerview适配器中的ViewModel。 运行我的应用程序后的错误代码

 kotlin.UninitializedPropertyAccessException: lateinit property mitemsViewModel has not been initialized
    at com.manju.mobilebilling.ui.items.ListAdapter.onBindViewHolder$lambda-0(ListAdapter.kt:65)
    at com.manju.mobilebilling.ui.items.ListAdapter.$r8$lambda$pJauI4KaymNCF6j043M3H3t3CwQ(ListAdapter.kt)
    at com.manju.mobilebilling.ui.items.ListAdapter$$ExternalSyntheticLambda0.onClick(D8$$SyntheticClass)
    at android.view.View.performClick(View.java:5651)
    at android.view.View$PerformClick.run(View.java:22445)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6138)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)

I need to delete an item recyclerview adapter which should be notified in room database, please help me in finding a solution and thanks in advance

 class ListAdapter : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {
private lateinit var mitemsViewModel: ItemsViewModel
private var itemsList = emptyList<Item>()
private lateinit var item: Item
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    return MyViewHolder(
        LayoutInflater.from(parent.context).inflate(R.layout.item_row_layout, parent, false)
    )
}
override fun getItemCount(): Int {
    return itemsList.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    item = itemsList.get(position)
    //always remember this technique to save the values in val type
    val currentItem = itemsList[position]
    holder.itemView.itemNameTV.text = currentItem.itemName.toString()
    holder.itemView.itemCodeTV.text = currentItem.itemCode.toString()
    holder.itemView.itemCategoryTV.text = currentItem.itemCategory.toString()
    holder.itemView.itemDescriptionTV.text = currentItem.itemDescription.toString()
    holder.itemView.itemSellingPriceTV.text = currentItem.itemSellingPrice.toString()
    holder.itemView.itemStockTV.text = currentItem.itemStock.toString()
    holder.itemView.deleteItem.setOnClickListener {
        val itName = holder.itemView.itemNameTV.text.toString()
        val itCode = holder.itemView.itemCodeTV.text.toString()
        val itCategory = holder.itemView.itemCategoryTV.text.toString()
        val itDescription = holder.itemView.itemDescriptionTV.text.toString()
        val itSellingPrice = holder.itemView.itemSellingPriceTV.text.toString()
        val itStock = holder.itemView.itemStockTV.text.toString()
        val itime = Item(0, itName, itCode, itCategory, itSellingPrice, itStock, itDescription)
        mitemsViewModel.deleteItem(itime)
        //dao.deleteItem(itemsList.get(position))
    }
}
fun setData(item: List<Item>) {
    this.itemsList = item
    notifyDataSetChanged()

}}

Help me how to initialize the ViewModel in recyclerview adapter.
The error code after running my app

 kotlin.UninitializedPropertyAccessException: lateinit property mitemsViewModel has not been initialized
    at com.manju.mobilebilling.ui.items.ListAdapter.onBindViewHolder$lambda-0(ListAdapter.kt:65)
    at com.manju.mobilebilling.ui.items.ListAdapter.$r8$lambda$pJauI4KaymNCF6j043M3H3t3CwQ(ListAdapter.kt)
    at com.manju.mobilebilling.ui.items.ListAdapter$ExternalSyntheticLambda0.onClick(D8$SyntheticClass)
    at android.view.View.performClick(View.java:5651)
    at android.view.View$PerformClick.run(View.java:22445)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6138)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

☆獨立☆ 2025-01-28 04:19:36

您应该在父活动fragment中初始化itemviewModel

private val viewModel by viewModels<ItemsViewModel>()

然后,而不是将其直接传递到listingAdapter声明自定义单击侦听器并将其用作参数:

// Add a parameter in the adapter
class ListAdapter(
    private val clickListener: ListClickListener
) : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {

    private var itemsList = emptyList<Item>()
    private lateinit var item: Item

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

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.item_row_layout, parent, false)
        )
    }

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        item = itemsList.get(position)
        //always remember this technique to save the values in val type
        val currentItem = itemsList[position]
        holder.itemView.itemNameTV.text = currentItem.itemName.toString()
        holder.itemView.itemCodeTV.text = currentItem.itemCode.toString()
        holder.itemView.itemCategoryTV.text = currentItem.itemCategory.toString()
        holder.itemView.itemDescriptionTV.text = currentItem.itemDescription.toString()
        holder.itemView.itemSellingPriceTV.text = currentItem.itemSellingPrice.toString()
        holder.itemView.itemStockTV.text = currentItem.itemStock.toString()
        holder.itemView.deleteItem.setOnClickListener {
            val itName = holder.itemView.itemNameTV.text.toString()
            val itCode = holder.itemView.itemCodeTV.text.toString()
            val itCategory = holder.itemView.itemCategoryTV.text.toString()
            val itDescription = holder.itemView.itemDescriptionTV.text.toString()
            val itSellingPrice = holder.itemView.itemSellingPriceTV.text.toString()
            val itStock = holder.itemView.itemStockTV.text.toString()
            val itime = Item(0, itName, itCode, itCategory, itSellingPrice, itStock, itDescription)
            // Call the click listener
            clickListener.onClick(iitem)
        }
    }

    fun setData(item: List<Item>) {
        this.itemsList = item
        notifyDataSetChanged()

    }
}

// Click listener class
class ListClickListener(val clickListener: (item: Item) -> Unit) {
    fun onClick(item: Item) = clickListener(item)
}

最后,在父active> activityfragment with with:

val adapter = ListAdapter(ListClickListener { item -> 
    viewModel.deleteItem(item)
})

You should initialize the ItemsViewModel in the parent Activity or Fragment:

private val viewModel by viewModels<ItemsViewModel>()

Then, instead of passing it directly to the ListAdapter declare a custom click listener and use that as parameter:

// Add a parameter in the adapter
class ListAdapter(
    private val clickListener: ListClickListener
) : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {

    private var itemsList = emptyList<Item>()
    private lateinit var item: Item

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

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.item_row_layout, parent, false)
        )
    }

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

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        item = itemsList.get(position)
        //always remember this technique to save the values in val type
        val currentItem = itemsList[position]
        holder.itemView.itemNameTV.text = currentItem.itemName.toString()
        holder.itemView.itemCodeTV.text = currentItem.itemCode.toString()
        holder.itemView.itemCategoryTV.text = currentItem.itemCategory.toString()
        holder.itemView.itemDescriptionTV.text = currentItem.itemDescription.toString()
        holder.itemView.itemSellingPriceTV.text = currentItem.itemSellingPrice.toString()
        holder.itemView.itemStockTV.text = currentItem.itemStock.toString()
        holder.itemView.deleteItem.setOnClickListener {
            val itName = holder.itemView.itemNameTV.text.toString()
            val itCode = holder.itemView.itemCodeTV.text.toString()
            val itCategory = holder.itemView.itemCategoryTV.text.toString()
            val itDescription = holder.itemView.itemDescriptionTV.text.toString()
            val itSellingPrice = holder.itemView.itemSellingPriceTV.text.toString()
            val itStock = holder.itemView.itemStockTV.text.toString()
            val itime = Item(0, itName, itCode, itCategory, itSellingPrice, itStock, itDescription)
            // Call the click listener
            clickListener.onClick(iitem)
        }
    }

    fun setData(item: List<Item>) {
        this.itemsList = item
        notifyDataSetChanged()

    }
}

// Click listener class
class ListClickListener(val clickListener: (item: Item) -> Unit) {
    fun onClick(item: Item) = clickListener(item)
}

Finally, declare your ListAdapter in the parent Activity or Fragment with:

val adapter = ListAdapter(ListClickListener { item -> 
    viewModel.deleteItem(item)
})
云醉月微眠 2025-01-28 04:19:36

初始化您的活动中的视图模型,而不是通过适配器构造函数传递

Initialize your viewmodel in your activity than pass it via adapter constructor

月下伊人醉 2025-01-28 04:19:36

如果您想通过MVVM和房间进行操作,请按照以下步骤操作:

  1. 创建自己的项目类,在DAO接口下方以识别删除和插入方法。

@dao
接口DaoItem {

 @Delete
 suspend fun delete(item: Item)
           
@Insert        
 suspend fun insertItem(item: Item)
        }
        
        }
  1. 创建一个存储库类:

类RepositoryItem(Val DaoItem:DaoItem){

    suspend fun insertItem(item: Item){
            daoItem.insertItem(item)
        }
    
      suspend fun deleteItem(item: Item) {
             daoItem.delete(item)
            }
        }
    }
  1. ,然后在MVVM类中创建删除方法:

    类ViewModeLitem(Val RepositoryItem:RepositoryItem)
    :viewModel(){

      fun deletevalue(item:item){
                     ViewModelsCope.Launch {
                         repositorityEtem.deleteitem(项目:项目)
                     }
                 }
             }
     

在适配器中使用ClickListener访问项目:

class ListAdapter(val clickListener: (Item)->Unit):RecyclerView.Adapter<ListAdapter.MyViewHolder>()
     {

class ViewHolder(item:View ):RecyclerView.ViewHolder(item){
 fun bind(item: Item,clickListener: (Item)->Unit) {

            val itName = itemView.itemNameTV.text.toString()
            val itCode = itemView.itemCodeTV.text.toString()
            val itCategory = itemView.itemCategoryTV.text.toString()
           val itime = Item(0, itName, itCode, itCategory)
   itemView.deleteItem.setOnClickListener(){
                clickListener(itime)

            }

}

在以下步骤中,您需要在ACT或Fragment类中声明MVVM类,并创建以下方法,以通过MVVM删除Recycler视图的项目:

 fun rowItemClicked(item: Item){
        viewModelItem.deleteValue(item)
        listAdapter.notifyDataSetChanged()
    }

   override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle? ): View? {


        listAdapter = ListAdapter( { item:Item->rowItemClicked(item)})


}

if you want to do it via MVVM and ROOM, follow the below steps :

  1. Create your own Item class and below Dao interface for identifying delete and insert methods.

@Dao
interface DaoItem {

 @Delete
 suspend fun delete(item: Item)
           
@Insert        
 suspend fun insertItem(item: Item)
        }
        
        }
  1. create a repository class:

class RepositoryItem(val daoItem: DaoItem) {

    suspend fun insertItem(item: Item){
            daoItem.insertItem(item)
        }
    
      suspend fun deleteItem(item: Item) {
             daoItem.delete(item)
            }
        }
    }
  1. and then in MVVM class create a delete method:

    class ViewModelItem(val repositoryItem:RepositoryItem)
    :ViewModel() {

                fun deleteValue(item: Item) {
                     viewModelScope.launch {
                         repositoryItem.deleteItem(item:Item)
                     }
                 }
             }
    

in adapter using clicklistener for accessing Item :

class ListAdapter(val clickListener: (Item)->Unit):RecyclerView.Adapter<ListAdapter.MyViewHolder>()
     {

class ViewHolder(item:View ):RecyclerView.ViewHolder(item){
 fun bind(item: Item,clickListener: (Item)->Unit) {

            val itName = itemView.itemNameTV.text.toString()
            val itCode = itemView.itemCodeTV.text.toString()
            val itCategory = itemView.itemCategoryTV.text.toString()
           val itime = Item(0, itName, itCode, itCategory)
   itemView.deleteItem.setOnClickListener(){
                clickListener(itime)

            }

}

in the following steps, you need to declare mvvm class in your act or fragment classes and create the below method for deleting the item of recycler view via mvvm:

 fun rowItemClicked(item: Item){
        viewModelItem.deleteValue(item)
        listAdapter.notifyDataSetChanged()
    }

and

   override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle? ): View? {


        listAdapter = ListAdapter( { item:Item->rowItemClicked(item)})


}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文