android - 如何从房间中删除最喜欢的项目
问题描述
我试图让用户单击他们单击的心形图标以将项目添加到收藏夹列表中,以便他们可以删除所述项目。除了向按钮添加 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
推荐阅读
- amazon-web-services - 基于 Cognito 凭证为 Lambda 提供对 DynamoDB 的细粒度访问
- django - method() 接受 1 个位置参数,但在分页装饰器操作中给出了 2 个
- r - 在 GLM 中显式显示字符串变量的公式
- java - 在运行到android中的下一条语句之前等待循环完成服务器调用
- r - 如何合并观察的极值点并仅选择主导单位?
- sql - 如何在链接数据库中使用子查询
- python - 为什么“get_rect()”不适用于列表?
- flutter - Flutter:动态初始路由
- redis - '(error) ERR Error running script (call to ...)' 当使用 LUA 脚本的 --eval 时
- c# - 使用 ProcessExecution 依次启动 2 个应用程序