如何解决将不同的依赖LiveData对象合并为一个
这是我的问题。
我必须从三个不同的LiveData
对象生成一个数据。其中两个取决于其中之一。仅当接收到所有三个对象数据时才触发观察者。
这里是一个例子:
结果对象包含产品信息和该产品的特定评价等级。结果对象看起来像这样:
public class RatedProduct {
private String productKey; // database key to the product
private String ratingKey; // database key to the specific rating
private Product product; // the product information
private Rating rating; // the specifiv rating information
private HashMap<String,Boolean> customTags; // list of tags
...
}
源分布在不同的数据库位置。
第一个对象UserRating
包含附加数据(customTags
)和仅两个键,分别指向产品和等级信息。
public class UserRating {
private String ratingKey;
private String productKey;
private HashMap<String,Boolean> customTags;
...
}
保存特定信息的Rating
和Product
对象。
public class Rating {
private float value; // value of the rating
private String productKey; // database key to the product
private String ratingComment;
...
}
public class Product {
private String name; // name of the product
private HashMap<String,Boolean> ratings; // list of all ratings
...
}
任务是将UserRating
,Rating
和Product
中的所有数据收集到一个RatedProduct
中,但隐藏必要的步骤。
我认为最好的方法是使用三个不同的LiveData
对象,并在MediatorLiveData
的帮助下将其合并
但是我不确定如何正确地执行此操作。我有点卡住了。我知道如何将UserRatingLiveData
作为源添加到MediatorLiveData
,但是我迷失了如何添加其余两个,并分别将其称为RatingLiveData
和ProductLiveData
包含在UserRatingLiveData
中。
第二个问题是,MediatorLiveData<RatedProduct>
仅在检索到所有数据时才更新,而不是仅在其中一个数据时才更新。
这就是我所拥有的(或多或少没有)。有趣的部分是LiveData<RatedProduct> getRatedProductLiveData()
我猜:
public class UserViewModel extends ViewModel {
...
private UserRatingsLiveData mUserRatingsLiveDate;
public UserViewModel() {
//
// Getting current user
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
if (mUser != null) {
this.mUserRatingsLiveDate =
new UserRatingsLiveData(
mUsersDatabaseReference.child(mUser.getUid() + "/" + DB_PATH_RATINGS));
} else {
Log.d(LOG_TAG,"mUser is NULL");
}
}
@NonNull
public LiveData<RatedProduct> getRatedProductLiveData() {
final MediatorLiveData<RatedProduct> liveDataMerger = new MediatorLiveData<> ();
final UserRating receivedUserRating = new UserRating();
liveDataMerger.addSource(this.mUserRatingsLiveDate,new Observer<UserRating>() {
public void onChanged(UserRating userRatings) {
}
});
return liveDataMerger;
}
}
作为附加提示:如果可以,数据库是Firebase RealTimeDatabase。
解决方法
尝试这样:
class MyViewModel {
val mainLiveData: LiveData<CustomClass> get() = _mainLiveData
private val firstLiveData = MutableLiveData<String>()
private val secondLiveData : MutableLiveData<Int>? = null
private val thirdLiveData : MutableLiveData<Long>? = null
private val _mainLiveData = MediatorLiveData<CustomClass>().also { mergeLiveData ->
mergeLiveData.addSource(firstLiveData) {
if (secondLiveData != null ) mergeLiveData.removeSource(secondLiveData)
if (thirdLiveData != null) mergeLiveData.removeSource(thirdLiveData)
secondLiveData = getSecondLiveData(firstLiveData.value)
thirdLiveData = getThirdLiveData(firstLiveData.value)
mergeLiveData.addSource(secondLiveData) {
updateMainLiveData(mergeLiveData)
}
mergeLiveData.addSource(thirdLiveData) {
updateMainLiveData(mergeLiveData)
}
}
}
private fun updateMainLiveData(mainLiveData: MediatorLiveData<CustomClass>) {
val first = firstLiveData.value ?: return
val second = secondLiveData.value ?: return
val third = thirdLiveData.value ?: return
mainLiveData.value = CustomClass(first,second,third)
}
data class CustomClass(
val first: String,val second: Int,val third: Long
)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。