1

我现在卡住了,目前想知道为什么我的可变数组列表返回 null,即使它正在使用 postvalue() 进行更新。我尝试使用 Toast 显示它,它显示 [] 我认为它是空的。它之间没有空间,所以看起来像一个盒子。为了显示文本,我也做了 toString() 。我将如何解决这个问题?

这是我的主要活动:

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()
        }
    })
}
4

4 回答 4

3

您将值发布到LiveDataActivity 中的对象viewmodel,它与片段的 不同实例viewmodel。让我们看看您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)
}

要获得viewmodel在您的活动和片段之间共享的内容,您必须将活动作为其所有者传递:

activity?.let { val viewmodel = ViewModelProviders.of(it).get(viewmodel::class.java) }
于 2019-08-22T12:58:48.843 回答
2

可能您可以查看开发人员指南示例来解决您的问题

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 中附加 ViewModel onCreate()

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
})
于 2019-08-22T13:04:37.483 回答
1

您是否使用了视图模型的相同实例?还是您在片段类中定义了另一个视图模型?问题可能是您正在访问视图模型的不同实例,而不是 MutableLiveData 已更新的实例

于 2019-08-22T12:28:36.693 回答
1

你可以使用这个:

    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
    }

    ...
于 2019-08-22T12:48:06.463 回答