繁体   English   中英

如何从 Room 中删除喜欢的项目

[英]How to delete a favorite item from Room

我试图让用户单击他们单击的心形图标以将项目添加到收藏夹列表,以便他们可以删除所述项目。 除了向按钮添加一个 setOnClickListener 之外,我不知道该怎么做,但是我不确定如何设法在我的列表中获取确切的项目。 关于如何做到这一点的任何建议?

这是收藏夹活动:

package com.example.newsapp

import android.content.Intent
import android.os.Bundle
import android.widget.ImageButton
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.newsapp.DB.FavoriteViewModel
import com.example.newsapp.databinding.ActivityFavlistBinding

class FavoritesActivity: AppCompatActivity() {

    private lateinit var mfavoriteViewModel: FavoriteViewModel
    private lateinit var binding: ActivityFavlistBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_favlist)
        binding = ActivityFavlistBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //recyclerview
        val adapter = FavoritesAdapter()
        binding.rvFavList.layoutManager = LinearLayoutManager(this)
        binding.rvFavList.adapter = adapter

        //favoriteViewModel
        mfavoriteViewModel = ViewModelProvider(this).get(FavoriteViewModel::class.java)
        mfavoriteViewModel.readAllData.observe(this, Observer { favorite ->
            adapter.setData(favorite)
        })

    }

}

这是此活动的适配器,我想在其中添加删除项目的选项。

package com.example.newsapp

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.example.newsapp.DB.FavoriteViewModel
import com.example.newsapp.DB.Favorites
import com.example.newsapp.databinding.FavItemBinding
import com.squareup.picasso.Picasso

class FavoritesAdapter: RecyclerView.Adapter<FavoritesAdapter.ViewHolder>() {

    private var favoriteList = emptyList<Favorites>()

    class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
        private val binding = FavItemBinding.bind(itemView)

        val favTitle: TextView = binding.tvFavTitle
        val favItem: ImageButton = binding.btnFavItem

        fun bind(favorites: Favorites) {
            Picasso.get().load(favorites.image).into(binding.ivFavsImage)
            favTitle.text = favorites.title
        }

    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(favoriteList[position])
        holder.favItem.setOnClickListener {
            //here is where i want to delete the item if user clicks the heart
            deleteFavorite(favoriteList[position])
            notifyDataSetChanged()
        }
    }

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

    fun setData(favorite: List<Favorites>){
        this.favoriteList = favorite
        notifyDataSetChanged()
    }

    fun deleteFavorite(favorite: Favorites){
        //delete this item

    }
}

这是最喜欢的道

@Dao
interface FavoritesDao {

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun addFavorite(favorite:Favorites)

    @Query("SELECT * FROM favorite_table ORDER BY id ASC")
    fun readALlData(): LiveData<List<Favorites>>

    @Delete
    suspend fun deleteFavorite(favorite: Favorites)

}

收藏夹视图模型:


package com.example.newsapp.DB

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.LiveData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class FavoriteViewModel(application: Application): AndroidViewModel(application) {

    val readAllData: LiveData<List<Favorites>>
    private val repository: FavoritesRepository

    init {
        val favoriteDao = FavoriteDatabase.getDatabase(application).favoriteDao()
        repository = FavoritesRepository(favoriteDao)
        readAllData = repository.readAllData
    }

    fun addFavorite(favorite:Favorites){
        viewModelScope.launch(Dispatchers.IO){
            repository.addFavorite(favorite)
        }
    }

    fun deleteFavorite(favorite:Favorites){
        viewModelScope.launch(Dispatchers.IO){
            repository.deleteFavorite(favorite)
        }
    }

}

你所做的一切都是正确的,你唯一需要做的就是将你想要删除的最喜欢的对象传递给你的视图模型,顺便说一句,如果你将 onClick 事件委托给你的片段/活动会更好。

像这样在您的适配器中先执行此操作

  private var onItemClickListener:((List<Favorites>) -> Unit)? = null

  fun setOnItemClickListener(listener:(List<Favorites>) -> Unit){
    onItemClickListener = listener
  }

并在您的活动中

   adapter.setOnItemClickListener { //this wil pass the item on click as 
   //"it" you can change the name 
        mfavoriteViewModel.delete(it)
    }

下面是我如何在我的应用程序中执行此操作的方式,我有一个滑动删除功能

分段

   //code block of when user swipe
   override fun onSwiped(viewHolder: RecyclerView.ViewHolder, 
        direction: Int) {
            val position = viewHolder.absoluteAdapterPosition
            val article = newsAdapter.differ.currentList[position]
            cryptoViewModel.deleteArticle(article) <--- //delete function in viewmodel
        }

视图模型

   fun deleteArticle(article: Article) = viewModelScope.launch {
    defaultRepository.deleteArticle(article)
}

存储库

 suspend fun deleteArticle(article: Article) {
    newsDatabase.getNewsDataDao().deleteArticle(article)
}

道接口

@Dao
interface NewsDataDao {

@Delete
suspend fun deleteArticle(article: Article)
}

我的完整代码可以在这里找到,如果需要,您可以参考https://github.com/zaidzak9/CryptoCurrencyTracker

您可以在您的Activity类中定义一个function ,该functionDB删除一个项目,然后更新您的RecyclerView adapter以接受此函数作为参数,并且当单击任何项​​目(收藏)时,只需调用此函数。

活动

private val deleteHandler: (Favorites)-> Unit = { 
    mfavoriteViewModel.deleteFavorite(it)
}

// When you create Recycler Adapter, pass the deleteHandler
val adapter = FavoritesAdapter(deleteHandler)

适配器

// Update Adapter signature to except deleteHandler
class FavoritesAdapter(val deleteHandler: (Favorites) -> Unit ): RecyclerView.Adapter<FavoritesAdapter.ViewHolder>()

// When item is clicked
holder.favItem.setOnClickListener {
    deleteHandler(favoriteList[position])
}

暂无
暂无

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

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