gpt4 book ai didi

android - 带过滤器的 LiveData?

转载 作者:行者123 更新时间:2023-12-03 23:47:33 27 4
gpt4 key购买 nike

我是 LiveData 的新手,最近我一直在做一些测试。我有一个应用程序,我需要在其中显示可以过滤的数据(名称、类别、日期......)。过滤器也可以组合(名称+日期)。该数据来自使用 Retrofit + RXJava 的 API 调用。

我知道我可以在不使用 LiveData 的情况下直接在我的 View 中获取数据。但是,我认为使用 ViewModel + LiveData 会很有趣。首先,要测试它是如何工作的,还要避免在 View 不活动时尝试设置数据(感谢 LiveData)并在配置更改时保存数据(感谢 ViewModel)。这些是我以前必须手动处理的事情。

所以问题是我没有找到一种方法来使用 LiveData 轻松处理过滤器。在用户选择一个过滤器的情况下,我设法使其与 switchMap 一起工作:

return Transformations.switchMap(filter,
filter -> LiveDataReactiveStreams.fromPublisher(
repository.getData(filter).toFlowable(BackpressureStrategy.BUFFER)));

如果他选择两个过滤器,我发现我可以使用自定义 MediatorLiveData,这就是我所做的。但是,这里的问题是 我的存储库调用次数与过滤器数量一样多 我有和 我不能同时设置两个过滤器 .

我的自定义 MediatorLiveData:
class CustomLiveData extends MediatorLiveData<Filter> {

CustomLiveData(LiveData<String> name, LiveData<String> category) {
addSource(name, name -> {
setValue(new Filter(name, category.getValue()));
});

addSource(category, category -> {
setValue(new Filter(name.getValue(), newCategory));
});
}
}
CustomLiveData trigger = new CustomLiveData(name, category);

return Transformations.switchMap(trigger,
filter -> LiveDataReactiveStreams.fromPublisher(
repository.getData(filter.getName(), filter.getCategory())
.toFlowable(BackpressureStrategy.BUFFER)));

我是否充分了解 MediatorLiveData 的用法?是否可以使用 LiveData 实现我想要实现的目标?

谢谢!

最佳答案

每次调用 updateData() 时,您在回答中的设置方式您将为您的 MediatorLiveData 添加一个新来源.每次新的 name 是否需要不同的来源?和 category改变了吗?
另外,你能有你的存储库方法getData吗?公开一个 LiveData直接地?最后,是否可以使用 Kotlin 代替 Java?
如果是这样,您可以通过有条件地检查 onChanged 来简化流程。每个来源何时设置 data 中的值中介者实时数据。
例如,按照文档 here :

//Create a new instance of MediatorLiveData if you don't need to maintain the old sources
val data = MediatorLiveData<List<Data>>().apply {
addSource(repository.getData(name, category)) { value ->
if (yourFilterHere) {
this.value = value
}
}
}

你也可以扩展这个想法,用 Kotlin 创建一个扩展函数:
inline fun <T> LiveData<T>.filter(crossinline filter: (T?) -> Boolean): LiveData<T> {
return MediatorLiveData<T>().apply {
addSource(this@filter) {
if (filter(it)) {
this.value = it
}
}
}
}
然后,在您的 updateData()你可以做的方法:
val data = repository.getData(name, category)
.filter { value ->
// Your boolean expression to validate the values to return
}

关于android - 带过滤器的 LiveData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61694154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com