如何检查更改collection?

How to check changing collection?

根据 collection 中的项目数量,我想执行某些操作。

例如

if i have 1 item in collection -> doFirstAction()
if i have 2 or more items in collection -> doSecondAction()
if i have 2 or more items in collection and deleted all instead one -> doSecondAction()

在此基础上,我需要检查更改列表。

我发现了类似的东西:ObservableList。它似乎解决了我的问题,但不幸的是我不知道如何正确使用它。

在我的 class 中,我需要检查这个 collection:

var viewModels: List<ConnectionViewModel> = emptyList()

更新: 有了这个 我这样写:

var viewModels: ObservableList<ConnectionViewModel> = ObservableArrayList<ConnectionViewModel>()

并在我的 collection 上添加侦听器:

fun setOnDataChange() {
    viewModels.addOnListChangedCallback(object :
        ObservableList.OnListChangedCallback<ObservableList<ConnectionViewModel>>() {
        override fun onChanged(sender: ObservableList<ConnectionViewModel>?) {}

        override fun onItemRangeRemoved(
            sender: ObservableList<ConnectionViewModel>?,
            positionStart: Int,
            itemCount: Int
        ) {
            showBiometricConfirmation = showConfirmation(itemCount)
        }

        override fun onItemRangeMoved(
            sender: ObservableList<ConnectionViewModel>?,
            fromPosition: Int,
            toPosition: Int,
            itemCount: Int
        ) {}

        override fun onItemRangeInserted(
            sender: ObservableList<ConnectionViewModel>?,
            positionStart: Int,
            itemCount: Int
        ) {
            showBiometricConfirmation = showConfirmation(itemCount)
        }

        override fun onItemRangeChanged(
            sender: ObservableList<ConnectionViewModel>?,
            positionStart: Int,
            itemCount: Int
        ) {}
    })
}

private fun showConfirmation(itemCount: Int): Boolean {
    return itemCount != 1
}

但是我有一些问题 我需要检查 collection 中的数字。如果号码是3,删除2后,我还需要调用doSecondAction()。但是如果 collection 号码是 1,需要调用 doFirstAction()

首先,您应该在 gradle 中启用数据绑定,在 android{}

android {
    ......
    dataBinding {
        enabled = true
    }
}

然后,在您的代码中创建空列表:

   val list: ObservableList<String> = ObservableArrayList<String>()

你可以这样设置监听器:

list.addOnListChangedCallback(object:ObservableList.OnListChangedCallback<ObservableList<String>>(){
            override fun onChanged(sender: ObservableList<String>?) {
                Log.d("Misha", "changed")
            }

            override fun onItemRangeRemoved(sender: ObservableList<String>?, positionStart: Int, itemCount: Int) {
                ...
            }

            override fun onItemRangeMoved(sender: ObservableList<String>?, fromPosition: Int, toPosition: Int, itemCount: Int) {
                ...
            }

            override fun onItemRangeInserted(sender: ObservableList<String>?, positionStart: Int, itemCount: Int) {
                ...
            }

            override fun onItemRangeChanged(sender: ObservableList<String>?, positionStart: Int, itemCount: Int) {
                ...
            }    
 })

您可以像这样添加(删除)值,或使用其他方法:

 list.addAll(0, listOf("Misha", "Akopov"))

一种方法是使用 ViewModel + 观察者模式。

  1. 视图模型。我们将要观察的列表放在这里
// SETTER
val _myList = MutableLiveData<MutableList<Item>>()

// GETTER
val myList: LiveData<MutableList<Item>> = _myList

init {

   _myList.value.add(item1)
   ... add remaining items

}

  1. Activity。我们修改/设置列表并观察列表变化。
mViewModel.myList.observe(this, Observer{

   // it == myList
   if (it.size == 1) doFirstAction()
   else if (it.size >= 2) doSecondAction()
   else if (it.size >= 2 && deleted all instead one) do second action

})

// MODIFY LIST
mViewModel._myList.value.remove(item2)
mViewModel._myList.value.add(item4)

会有很多空检查警告。稍后您可能想将 _myList 设为私有并执行

使用下一个解决方案解决我的问题:

创建下一个变量:

private var quickConfirmMode: Boolean = false

并在我的习惯中使用它 setter:

var viewModels: List<ConnectionViewModel> = emptyList()
    set(value) {
        quickConfirmMode = value.size == 1 && (field.size == 1 || field.isEmpty())
        field = value
    }

解决方法: Where field is backing 属性,这保存了我的值。有关 getter 和 setter 的更多信息,您可以阅读 here。 所以在我的习惯 setter 中,我检查了我的新旧值,然后我设置了 quickConfirmMode 的值。