android - 单击按钮后,从recyclerview中删除项目-Kotlin MVVM Firestore

标签 android kotlin mvvm android-recyclerview google-cloud-firestore

当用户单击recyclerview中的删除按钮时,我无法从Firestore集合中删除数据。我可以从recyclerview中删除它,没有任何问题,但是我很难在适配器, View 模型和处理Firestore操作的存储库之间建立连接。

在适配器中,我从recyclerview中删除了用户单击的项目:

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

var data = mutableListOf<Product>()
    set(value) {
        field = value
        notifyDataSetChanged()
    }

override fun getItemCount() = data.size

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val item = data[position]
    holder.bind(item)

    holder.deleteButton.setOnClickListener {
        data.removeAt(position)
        notifyDataSetChanged()
    }
} ...

在对我的 View 模型中的Firestore集合进行查询之后,将填充recyclerview:
class ArticleViewModel(private val repository: ProductRepository) : ViewModel() {

var savedProducts: MutableLiveData<MutableList<Product>> = MutableLiveData<MutableList<Product>>()

init {
    savedProducts = getProducts()
}

fun getProducts(): MutableLiveData<MutableList<Product>> {
    repository.getProducts().addSnapshotListener(EventListener<QuerySnapshot> { value, e ->
        if (e != null) {
            savedProducts.value = null
            return@EventListener
        }

        val savedProductsList: MutableList<Product> = mutableListOf()
        for (doc in value!!) {
            val item = doc.toObject(Product::class.java)
            item.id = doc.id
            savedProductsList.add(item)
        }
        savedProductsList.sortBy { i -> i.productName }
        savedProducts.value = savedProductsList
    })

    return savedProducts
}  }

然后,在片段中,我观察到saveProducts可能发生的任何更改:
class ArticleOverviewFragment : Fragment(), KodeinAware {
override val kodein: Kodein by kodein()
private val factory: ArticleViewModelFactory by instance()
private lateinit var viewModel: ArticleViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val binding: FragmentArticleOverviewBinding =
        DataBindingUtil.inflate(inflater, R.layout.fragment_article_overview, container, false)

    viewModel = ViewModelProviders.of(this, factory).get(ArticleViewModel::class.java)

    binding.viewModel = viewModel

    val adapter = ArticleAdapter()
    binding.recyclerViewGoods.adapter = adapter

    viewModel.savedProducts.observe(viewLifecycleOwner, Observer {
        it?.let {
            adapter.data = it
        }
    })

    ...
} }

有没有一种方法可以观察/保存适配器中已删除项目的ID,并将该ID从适配器“转移”到UI,从而在每次填充包含ID的字段时调用在ViewModel中声明的函数?还是应该直接从适配器访问viewmodel?不知何故,这有点不对劲...

最佳答案

声明一个局部变量

var removedPosition : Int ? = null

然后将此变量更新为deleteButton的onClick事件
holder.deleteButton.setOnClickListener {
        data.removeAt(position)
        removedPosition = position
        notifyDataSetChanged()
    }

请在Adapter(ArticleAdapter)中制作一种方法
fun getRemoveItemPosition() : Int {
   var position = removedPosition
   return position;
}

它返回已删除项目的位置,并在UI(ArticleOverviewFragment)中调用该方法,您需要在该方法中从recyclerview获取已删除项目的位置
var removedItemPosition = adapter.getRemoveItemPosition()

现在,您将使用名为removedItemPosition的变量获取删除项Position的值

因此,您可以在UI中获取已删除项目的位置,您可以在其中调用在viewmodel中声明的函数(ArticleViewModel)来删除firestore集合中的特定项目。

关于android - 单击按钮后,从recyclerview中删除项目-Kotlin MVVM Firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61252600/

相关文章:

android - Fragment 中的参数仍然为空

Kotlin Activity 无法扩展。这个类型是final的,所以不能被继承

android - 如何使用 Moshi 解析对对象模型的改造 json 响应

asp.net-mvc - ASP.net MVC 或 Knockout.JS

ios - 将 UITextField 或按钮与 viewModel 绑定(bind)

c# - 如何避免多个 View 从同一个 View 模型接收数据

android - Google Play 游戏服务成就加载

android - 无法启动 Gauge Intellij 插件

Android 从媒体播放器中删除快进和倒带按钮

android - 将页脚 View 添加到 Android 中的多列 GridView?