即使在 postValue() Kotlin 之后,MutableLiveData ArrayList 还是空的
MutableLiveData ArrayList is empty even after postValue() Kotlin
我现在卡住了,目前想知道为什么我的可变数组列表 returns 为 null,即使它正在使用 postvalue() 更新。我尝试使用 Toast 显示它,它显示了 [],我认为它是空的。它之间没有 space 所以它看起来像一个盒子。为了显示文本,我也做了 toString() 。我该如何解决这个问题?
这是我的主要内容 Activity:
val list = ArrayList<String>()
list.add("text1")
list.add("text2")
val viewmodel = ViewModelProviders.of(this).get(viewmodel::class.java)
viewmodel.Testlist.postValue(list)
视图模型:
class viewmodel: ViewModel() {
val Testlist: MutableLiveData<ArrayList<String>> = MutableLiveData()
init {
Testlist.value = arrayListOf()
}
}
片段:
顶部区域:
activity?.let {
val viewmodel = ViewModelProviders.of(this).get(viewmodel::class.java)
observeInput(viewmodel)
}
底部区域:
private fun observeInput(viewmodel: viewmodel) {
viewmodel.Testlist.observe(viewLifecycleOwner, Observer {
it?.let {
Toast.makeText(context, it.toString(), Toast.LENGTH_LONG).show()
}
})
}
您是否使用了相同的视图模型实例?或者您是否在片段 class 中定义了另一个视图模型?问题可能是您正在访问视图模型的不同实例,而不是 MutableLiveData 已更新的实例
你可以使用这个:
fun <T : Any?> MutableLiveData<ArrayList<T>>.default(initialValue: ArrayList<T>) = apply { setValue(initialValue) }
然后使用这个函数如下:
viewmodel.Testlist.default(ArrayList())
对我来说,我有一个 BaseActivity,其他活动从它扩展:
class UAppCompatActivity : AppCompatActivity() {
protected fun <T : Any?> MutableLiveData<ArrayList<T>>.default(initialValue: ArrayList<T>) = apply { setValue(initialValue) }
protected fun <T> MutableLiveData<ArrayList<T>>.addItem(item: T) {
val updatedItems = this.value as ArrayList
updatedItems.add(item)
this.value = updatedItems
}
protected fun <T> MutableLiveData<ArrayList<T>>.deleteItem(item: T) {
val updatedItems = this.value as ArrayList
updatedItems.remove(item)
this.value = updatedItems
}
...
您 post activity 的 viewmodel
中 LiveData
对象的值,它与片段的 [=13= 的实例不同].让我们看看在片段中实例化 viewmodel
的方式:
activity?.let {
// activity can be refered by the implicit parameter `it`
// `this` refers to the current fragment hence it's the owner of the view model
val viewmodel = ViewModelProviders.of(this).get(viewmodel::class.java)
observeInput(viewmodel)
}
要获得在您的 activity 和片段之间共享的 viewmodel
,您必须将 activity 作为其所有者传递:
activity?.let { val viewmodel = ViewModelProviders.of(it).get(viewmodel::class.java) }
您可能会看到开发人员指南示例来解决您的问题
https://developer.android.com/topic/libraries/architecture/viewmodel.html#kotlin
// 共享视图模型
class SharedViewModel : ViewModel() {
private val usersList: MutableLiveData<List<String>>()
fun getUsers(): LiveData<List<String>> {
return usersList
}
fun setUsers(users: List<String>) {
usersList.value = users
}
}
// 在 Activity onCreate()
中附加 ViewModel
val model = ViewModelProviders.of(this)[SharedViewModel::class.java]
val list = arrayListOf<String>()
list.add("user1")
list.add("user2")
model.setUsers(list)
// 在片段 onCreateView()
中获取相同的 ViewModel 实例
model = activity?.run {
ViewModelProviders.of(this)[SharedViewModel::class.java]
} ?: throw Exception("Invalid Activity")
model.getUsers().observe(this, Observer<List<User>>{ users ->
// update UI
})
我现在卡住了,目前想知道为什么我的可变数组列表 returns 为 null,即使它正在使用 postvalue() 更新。我尝试使用 Toast 显示它,它显示了 [],我认为它是空的。它之间没有 space 所以它看起来像一个盒子。为了显示文本,我也做了 toString() 。我该如何解决这个问题?
这是我的主要内容 Activity:
val list = ArrayList<String>()
list.add("text1")
list.add("text2")
val viewmodel = ViewModelProviders.of(this).get(viewmodel::class.java)
viewmodel.Testlist.postValue(list)
视图模型:
class viewmodel: ViewModel() {
val Testlist: MutableLiveData<ArrayList<String>> = MutableLiveData()
init {
Testlist.value = arrayListOf()
}
}
片段:
顶部区域:
activity?.let {
val viewmodel = ViewModelProviders.of(this).get(viewmodel::class.java)
observeInput(viewmodel)
}
底部区域:
private fun observeInput(viewmodel: viewmodel) {
viewmodel.Testlist.observe(viewLifecycleOwner, Observer {
it?.let {
Toast.makeText(context, it.toString(), Toast.LENGTH_LONG).show()
}
})
}
您是否使用了相同的视图模型实例?或者您是否在片段 class 中定义了另一个视图模型?问题可能是您正在访问视图模型的不同实例,而不是 MutableLiveData 已更新的实例
你可以使用这个:
fun <T : Any?> MutableLiveData<ArrayList<T>>.default(initialValue: ArrayList<T>) = apply { setValue(initialValue) }
然后使用这个函数如下:
viewmodel.Testlist.default(ArrayList())
对我来说,我有一个 BaseActivity,其他活动从它扩展:
class UAppCompatActivity : AppCompatActivity() {
protected fun <T : Any?> MutableLiveData<ArrayList<T>>.default(initialValue: ArrayList<T>) = apply { setValue(initialValue) }
protected fun <T> MutableLiveData<ArrayList<T>>.addItem(item: T) {
val updatedItems = this.value as ArrayList
updatedItems.add(item)
this.value = updatedItems
}
protected fun <T> MutableLiveData<ArrayList<T>>.deleteItem(item: T) {
val updatedItems = this.value as ArrayList
updatedItems.remove(item)
this.value = updatedItems
}
...
您 post activity 的 viewmodel
中 LiveData
对象的值,它与片段的 [=13= 的实例不同].让我们看看在片段中实例化 viewmodel
的方式:
activity?.let {
// activity can be refered by the implicit parameter `it`
// `this` refers to the current fragment hence it's the owner of the view model
val viewmodel = ViewModelProviders.of(this).get(viewmodel::class.java)
observeInput(viewmodel)
}
要获得在您的 activity 和片段之间共享的 viewmodel
,您必须将 activity 作为其所有者传递:
activity?.let { val viewmodel = ViewModelProviders.of(it).get(viewmodel::class.java) }
您可能会看到开发人员指南示例来解决您的问题
https://developer.android.com/topic/libraries/architecture/viewmodel.html#kotlin
// 共享视图模型
class SharedViewModel : ViewModel() {
private val usersList: MutableLiveData<List<String>>()
fun getUsers(): LiveData<List<String>> {
return usersList
}
fun setUsers(users: List<String>) {
usersList.value = users
}
}
// 在 Activity onCreate()
中附加 ViewModelval model = ViewModelProviders.of(this)[SharedViewModel::class.java]
val list = arrayListOf<String>()
list.add("user1")
list.add("user2")
model.setUsers(list)
// 在片段 onCreateView()
中获取相同的 ViewModel 实例model = activity?.run {
ViewModelProviders.of(this)[SharedViewModel::class.java]
} ?: throw Exception("Invalid Activity")
model.getUsers().observe(this, Observer<List<User>>{ users ->
// update UI
})