我使用LiveData
+ Transformations.map()
:
private final LiveData<List<Task>> observableTasks;
(...)
observableTasks = Transformations.map(tasksRepository.getTasks(), tasks-> filterTasks(tasks));
如何强制LiveData
刷新?我需要Transformations.map()
来准备新列表。当用户更改过滤选项时,我需要再次调用filterTasks(tasks)
并显示新的排序列表。来自存储库(tasksRepository.getTasks()
)的数据保持不变。
答案 0 :(得分:0)
我想我找到了解决方案。我创建了其他LiveData
字段filterChangeEvent
。每次用户更改过滤顺序时,新值都将设置为filterChangeEvent
。然后,我将switchMap
与filterChangeEvent
一起用作触发器:
observableTasks = Transformations.switchMap(filterChangeEvent, input -> {
final MediatorLiveData<List<Tasks>> result = new MediatorLiveData<>();
result.addSource(tasksRepository.getTasks(), tasks -> result.setValue(filterTasks(tasks)));
return result;
});
答案 1 :(得分:0)
根据您提供的信息,我执行了以下步骤,并且我的可观察对象已按预期触发。我认为您在处理转换的存储库或类中做错了。由于没有足够的代码来检查,因此我创建了自己的虚拟类:
public class Task {
private String id;
public Task(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@NonNull
@Override
public String toString() {
return "Task id is " +id;
}
}
public class TasksRepository {
private List<Task> taskList = new ArrayList<>();
private MutableLiveData<List<Task>> _tasks = new MutableLiveData<>();
private LiveData<List<Task>> tasks = _tasks;
public TasksRepository() {
for (int i = 0; i < 5; i++) {
taskList.add(new Task(createTaskId()));
}
_tasks.setValue(taskList);
}
private String createTaskId() {
return UUID.randomUUID().toString();
}
public void addTask() {
taskList.add(new Task(createTaskId()));
_tasks.setValue(taskList);
}
public LiveData<List<Task>> getTasks() {
return tasks;
}
}
public class MyViewModel {
private final LiveData<List<Task>> observableTasks;
public MyViewModel(TasksRepository tasksRepository) {
this.observableTasks = Transformations.map(tasksRepository.getTasks(), this::changeId);
}
private List<Task> changeId(List<Task> tasks) {
List<Task> resultTaks = new ArrayList<>();
for (Task task : tasks) {
String newId = "TASK" + task.getId();
task.setId(newId);
resultTaks.add(task);
}
return resultTaks;
}
public LiveData<List<Task>> getObservableTasks() {
return observableTasks;
}
}
TasksRepository tasksRepository = new TasksRepository();
MyViewModel viewModel = new MyViewModel(tasksRepository);
button.setOnClickListener(v -> tasksRepository.addTask());
viewModel.getObservableTasks().observe(this,
tasks -> Log.d(TAG, Arrays.toString(new List[]{tasks})));
答案 2 :(得分:0)
Checkout Transformation.switchMap. It explains following case when to use it also.)
场景:
在存储库包含User(1,“ Jane”)和User(2,“ John”)的情况下,当userIdLiveData值设置为“ 1”时,switchMap将调用getUser(1),它将返回一个包含值User(1,“ Jane”)的LiveData。因此,现在,userLiveData将发出User(1,“ Jane”)。当存储库中的用户更新为User(1,“ Sarah”)时,userLiveData将自动得到通知,并发出User(1,“ Sarah”)。
当使用userId =“ 2”调用setUserId方法时,userIdLiveData的值将更改并自动触发从存储库获取ID为“ 2”的用户的请求。因此,userLiveData发出User(2,“ John”)。由repository.getUserById(1)返回的LiveData作为源被删除。