亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

LiveData,Transformations.map() - 當用戶更改過濾順序時如何強制刷新?

LiveData,Transformations.map() - 當用戶更改過濾順序時如何強制刷新?

智慧大石 2022-05-21 19:54:42
我使用LiveData+ Transformations.map():private final LiveData<List<Task>> observableTasks;(...)observableTasks =  Transformations.map(tasksRepository.getTasks(), tasks-> filterTasks(tasks));如何強制LiveData刷新?我需要Transformations.map()準備新的清單。當用戶更改過濾選項時,我需要filterTasks(tasks)再次調用并顯示新的排序列表。來自存儲庫 ( tasksRepository.getTasks()) 的數據保持不變。
查看完整描述

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})));


查看完整回答
反對 回復 2022-05-21
?
一只萌萌小番薯

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;

    });


查看完整回答
反對 回復 2022-05-21
?
慕尼黑8549860

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 作為源被刪除。


查看完整回答
反對 回復 2022-05-21
  • 3 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號