Android 如何更改ViewModel中的可变LiveData值

Android 如何更改ViewModel中的可变LiveData值,android,kotlin,viewmodel,android-livedata,Android,Kotlin,Viewmodel,Android Livedata,我需要在我的ViewModel中更改MutableLiveData的值,但我无法更改,因为该值等于null,我认为需要在其中建立一个观察者来更改它,但我不知道如何做,也不知道这是否是一个好主意 录音机列表视图模型 class AudioRecordersListViewModel() : ViewModel() { var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = Mut

我需要在我的ViewModel中更改MutableLiveData的值,但我无法更改,因为该值等于null,我认为需要在其中建立一个观察者来更改它,但我不知道如何做,也不知道这是否是一个好主意

录音机列表视图模型

class AudioRecordersListViewModel() : ViewModel() {
    var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();
    private var audioRecordDao: AudioRecordDao? = null

    @Inject
    constructor(audioRecordDao: AudioRecordDao) : this() {
        this.audioRecordDao = audioRecordDao
        viewModelScope.launch {
        val liveDataItems = audioRecordDao
                .getAll().value!!.map { item -> AudioRecordUI(item) }
                .toMutableList()

            if (liveDataItems.size > 0) {
                liveDataItems[0].isActive = true
            }

            audioRecordsLiveData.postValue(liveDataItems)
        }
    }
}
class AudioRecorderListViewModel():ViewModel(){
var audioRecordsLiveData:MutableLiveData=MutableLiveData();
私有变量audioRecordDao:audioRecordDao?=null
@注入
构造函数(audioRecordDao:audioRecordDao):this(){
this.audioRecordDao=audioRecordDao
viewModelScope.launch{
val liveDataItems=audioRecordDao
.getAll().value!!.map{item->AudioRecordUI(item)}
.toMutableList()
如果(liveDataItems.size>0){
liveDataItems[0]。isActive=true
}
audioRecordsLiveData.postValue(liveDataItems)
}
}
}
录音机

@Dao
interface AudioRecordDao {
    @Query("SELECT * FROM AudioRecordEmpty")
    fun getAll(): LiveData<MutableList<AudioRecordEmpty>>
}
@Dao
接口AudioRecordDao{
@查询(“从AudioRecordEmpty中选择*)
fun getAll():LiveData
}

首先,使用
不是一个好主意,它很容易导致空指针异常,而不是us

您可以在LiveData上设置空列表,并向该列表添加新数据:

var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();

init {
    audioRecordsLiveData.value = mutableListOf()
}
永远不要在片段/活动中设置LiveData

如果您需要更新LiveData:

mViewModel.mLiveData.observe(this, Observer { list ->
        if (list.isNotEmpty()) {
            //Update UI Stuff
        }
})
mViewModel.onSomethingHappened()
内部视图模型:

fun onSomethingHappened() {
  ...
  ...
  ...
  mLiveData.value = NEW_VALUE
}
如果要从其他线程更新LiveData,请使用:

mLiveData.postValue()

首先,使用
不是一个好主意,它很容易导致空指针异常,而不是us

您可以在LiveData上设置空列表,并向该列表添加新数据:

var audioRecordsLiveData: MutableLiveData<MutableList<AudioRecordUI>> = MutableLiveData();

init {
    audioRecordsLiveData.value = mutableListOf()
}
永远不要在片段/活动中设置LiveData

如果您需要更新LiveData:

mViewModel.mLiveData.observe(this, Observer { list ->
        if (list.isNotEmpty()) {
            //Update UI Stuff
        }
})
mViewModel.onSomethingHappened()
内部视图模型:

fun onSomethingHappened() {
  ...
  ...
  ...
  mLiveData.value = NEW_VALUE
}
如果要从其他线程更新LiveData,请使用:

mLiveData.postValue()