LiveData,Transformations.map() - 如何强制在用户更改过滤以刷新?

问题描述 投票:2回答:3

我用LiveData + Transformations.map()

private final LiveData<List<Task>> observableTasks;
(...)
observableTasks =  Transformations.map(tasksRepository.getTasks(), tasks-> filterTasks(tasks));

如何强制LiveData刷新?我需要Transformations.map()准备新的列表。当用户改变过滤我需要再次打电话filterTasks(tasks)并显示新的选择,排序列表。从数据仓库(tasksRepository.getTasks())来保持不变。

java android android-architecture-components android-livedata
3个回答
0
投票

我想我找到了解决办法。我创造了额外的LiveDatafilterChangeEvent。每当用户改变滤波顺序,新的值设置为filterChangeEvent。然后我用switchMapfilterChangeEvent作为触发:

    observableTasks = Transformations.switchMap(filterChangeEvent, input -> {
        final MediatorLiveData<List<Tasks>> result = new MediatorLiveData<>();
        result.addSource(tasksRepository.getTasks(), tasks -> result.setValue(filterTasks(tasks)));
        return result;
    });

0
投票

根据您所提供的信息,我下面的步骤,我观察到触发得到了预期。我认为你做错事无论是在仓库或在课堂上,你处理的转变。由于没有足够的代码来检查,我创建了自己的虚拟类:

  1. 我创建虚工POJO:
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;
    }
}
  1. 我创建了具有LiveData虚拟存储库:
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;
    }
}
  1. 创建的类名为MyViewModel能够处理改造。改造过程中,我们只需要添加“TEST”前缀任务ID。您可以与您的代码进行比较,它应该是罚款:
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;
    }
}
  1. 加上当按钮点击数据和观察数据的变化:
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})));

0
投票

Checkout Transformation.switchMap. It explains following case when to use it also.)

场景:

在存储库中包含用户的场景(1,“简”)和用户(2,“约翰”),当userIdLiveData值设置为“1”,则switchMap将调用的getUser(1),将返回一个LiveData包含该值的用户(1,“简”)。所以,现在,该userLiveData会发出用户(1,“简”)。当库的用户被更新到用户(1,“莎拉”),该userLiveData就会自动通知,并会发出用户(1,“莎拉”)。

当setUserId方法被调用用户id =“2”,的userIdLiveData变化,自动的值触发用于从存储库获取与ID“2”的用户的请求。因此,userLiveData发出用户(2, “约翰”)。通过repository.getUserById(1)返回的LiveData作为源被去除。

© www.soinside.com 2019 - 2024. All rights reserved.