如何检查更改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 + 观察者模式。
- 视图模型。我们将要观察的列表放在这里
// SETTER
val _myList = MutableLiveData<MutableList<Item>>()
// GETTER
val myList: LiveData<MutableList<Item>> = _myList
init {
_myList.value.add(item1)
... add remaining items
}
- 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
的值。
根据 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 + 观察者模式。
- 视图模型。我们将要观察的列表放在这里
// SETTER
val _myList = MutableLiveData<MutableList<Item>>()
// GETTER
val myList: LiveData<MutableList<Item>> = _myList
init {
_myList.value.add(item1)
... add remaining items
}
- 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
的值。