LiveData 是抽象的 android
LiveData is abstract android
我尝试初始化我的 LiveData 对象,但出现错误:"LiveData is abstract, It cannot be instantiated"
LiveData listLiveData = new LiveData<>();
因为它是抽象的(如@CommonsWare 所说),您需要将它扩展到一个子类,然后按照以下形式覆盖所需的方法:
public class LiveDataSubClass extends LiveData<Location> {
}
在 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
}
}
}
是的,你不能实例化它,因为它是一个抽象class。如果你想观察其他livedata对象可以尝试使用MutableLiveData if you want to set values in the live data object. You can also use Mediator live data
您需要使用 MutableLiveData,然后将其转换为它的父级 class LiveData。
public class MutableLiveData
extends LiveData
[MutableLiveData is] LiveData which publicly exposes setValue(T) and postValue(T) method.
你可以这样做:
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"
我认为实现此目标的更好方法是使用我们称之为 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).
这样做可以维护 ViewModel
class 私有的可编辑 MutableLiveData
,而它的 read-only
版本维护为 LiveData
,带有getter
即returns原值。
P.S。 - 注意两个字段的命名约定,使用 (_) 下划线 。这不是强制性的,但建议这样做。
我尝试初始化我的 LiveData 对象,但出现错误:"LiveData is abstract, It cannot be instantiated"
LiveData listLiveData = new LiveData<>();
因为它是抽象的(如@CommonsWare 所说),您需要将它扩展到一个子类,然后按照以下形式覆盖所需的方法:
public class LiveDataSubClass extends LiveData<Location> {
}
在 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
}
}
}
是的,你不能实例化它,因为它是一个抽象class。如果你想观察其他livedata对象可以尝试使用MutableLiveData if you want to set values in the live data object. You can also use Mediator live data
您需要使用 MutableLiveData,然后将其转换为它的父级 class LiveData。
public class MutableLiveData extends LiveData
[MutableLiveData is] LiveData which publicly exposes setValue(T) and postValue(T) method.
你可以这样做:
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"
我认为实现此目标的更好方法是使用我们称之为 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).
这样做可以维护 ViewModel
class 私有的可编辑 MutableLiveData
,而它的 read-only
版本维护为 LiveData
,带有getter
即returns原值。
P.S。 - 注意两个字段的命名约定,使用 (_) 下划线 。这不是强制性的,但建议这样做。