【问题标题】:Delete item from recyclerview on button click - Kotlin MVVM Firestore单击按钮时从 recyclerview 中删除项目 - Kotlin MVVM Firestore
【发布时间】:2020-07-29 19:57:48
【问题描述】:

当用户单击回收站视图中的删除按钮时,我无法从 Firestore 集合中删除数据。我可以从 recyclerview 中删除它而没有任何问题,但是我无法在适配器、视图模型和处理 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()
    }
} ...

在我的视图模型中对 Firestore 集合进行查询后填充回收器视图:

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
}  }

在我的 Fragment 中,我会观察到 savedProducts 可能发生的任何变化:

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 的字段为人口稠密?或者我应该直接从适配器访问视图模型?不知怎的,这感觉有点不对……

【问题讨论】:

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


    【解决方案1】:

    声明一个局部变量

    var removedPosition : Int ? = null
    

    然后将此变量更新为deleteButton的onClick事件

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

    请在适配器中创建一种方法 (ArticleAdapter)

    fun getRemoveItemPosition() : Int {
       var position = removedPosition
       return position;
    }
    

    返回已移除项目的位置并在 UI(ArticleOverviewFragment) 中调用该方法,您需要从回收站视图中获取已移除项目的位置

    var removedItemPosition = adapter.getRemoveItemPosition()
    

    现在您将使用名为 removedItemPosition 的变量获取删除项目位置的值


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

    【讨论】:

    • 啊,对!这是个好主意!!还有一种方法可以在 UI 中观察 removedItemPosition 吗?并且只在removedItemPosition的值发生变化时才跳转到viewmodel函数中?
    • 用一个简单的 clicklistener 界面解决了这个问题。再次感谢:)
    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多