8

我尝试初始化我的 LiveData 对象,它给出了错误:“LiveData 是抽象的,它不能被实例化”

LiveData listLiveData = new LiveData<>();

4

5 回答 5

5

在 ViewModel 中,您可能想MutableLiveData改用。

例如:

class MyViewModel extends ViewModel {
  private MutableLiveData<String> data = new MutableLiveData<>();

  public LiveData<String> getData() {
    return data;
  }

  public void loadData() {
    // Do some stuff to load the data... then
    data.setValue("new data"); // Or use data.postValue()
  }
}

或者,在 Kotlin 中:

class MyViewModel : ViewModel() {
  private val _data = MutableLiveData<String>()
  val data: LiveData<String> = _data

  fun loadData() {
    viewModelScope.launch {
      val result = // ... execute some background tasks
      _data.value = result
    }
  }
}
于 2018-01-24T05:38:32.113 回答
4

由于它是抽象的(正如@CommonsWare 所说),您需要将其扩展为子类,然后按照表单中的要求覆盖方法:

public class LiveDataSubClass extends LiveData<Location> {

}

有关更多详细信息,请参阅文档

于 2017-08-10T23:24:42.313 回答
0

我认为实现这一点的更好方法是使用我们所说的Backing Property来实现更好Encapsulation的属性。

使用示例:

private val _userPoints = MutableLiveData<Int>()// used as a private member

val userPoints: LiveData<Int>
    get() {
        return _userPoints 
    } //used to access the value inside the UI controller (Fragment/Activity). 

这样做维护了一个可编辑MutableLiveData的类私有,ViewModelread-only它的版本被维护为 a LiveData,其中 agetter返回原始值。

PS - 注意两个字段的命名约定,使用 (_)下划线。这不是强制性的,但建议这样做。

于 2019-12-19T10:22:23.867 回答
0

是的,你不能实例化它,因为它是一个抽象类。如果要在实时数据对象中设置值,可以尝试使用MutableLiveData 。如果您想观察其他 livedata 对象,也可以使用Mediator 实时数据。

于 2018-09-22T12:19:11.040 回答
0

您需要使用 MutableLiveData,然后将其转换为它的父类 LiveData。

公共类 MutableLiveData 扩展 LiveData

[MutableLiveData is] LiveData 公开了 setValue(T) 和 postValue(T) 方法。

你可以这样做:

fun initializeLiveData(foo: String): LiveData<String> {
    return MutableLiveData<String>(foo)
}

那么你得到:

Log.d("now it is LiveData", initializeLiveData("bar").value.toString())
// prints "D/now it is LiveData: bar"
于 2019-10-09T21:56:42.130 回答