3 回答

TA貢獻1873條經驗 獲得超9個贊
根據您提供的信息,我執行了以下步驟,并且我的 observable 已按預期觸發。我認為您在存儲庫或處理轉換的類中做錯了什么。由于沒有足夠的代碼檢查,我創建了自己的虛擬類:
我創建了虛擬任務 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;
}
}
我創建了具有 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;
}
}
創建了一個名為 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;
}
}
在單擊按鈕時添加數據并觀察數據變化:
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})));

TA貢獻1795條經驗 獲得超7個贊
我想我找到了解決方案。我創建了附加LiveData字段filterChangeEvent。每次用戶更改過濾順序時,都會將新值設置為filterChangeEvent。然后我用switchMapwithfilterChangeEvent作為觸發器:
observableTasks = Transformations.switchMap(filterChangeEvent, input -> {
final MediatorLiveData<List<Tasks>> result = new MediatorLiveData<>();
result.addSource(tasksRepository.getTasks(), tasks -> result.setValue(filterTasks(tasks)));
return result;
});

TA貢獻1818條經驗 獲得超11個贊
設想:
在存儲庫包含 User(1, "Jane") 和 User(2, "John") 的場景中,當 userIdLiveData 值設置為“1”時,switchMap 將調用 getUser(1),這將返回一個 LiveData包含值 User(1, "Jane")。所以現在,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 作為源被刪除。
添加回答
舉報