web-dev-qa-db-ja.com

AndroidViewModelでLiveDataを初期化する

ViewModel内のLiveDataオブジェクトを初期化する方法を探しています。現在、アイテムは、アクティビティからsetQueryメソッドが呼び出されたときにのみ初期化されます。

public class MyListViewModel extends AndroidViewModel {

private final LiveData <List<Item>> items;
private final MutableLiveData<String> query = new MutableLiveData<>();


private MyDatabase db;

public MyListViewModel(Application application) {
    super(application);
    db  = MyDatabase.getInstance(application);
    items = Transformations.switchMap(query, (search)->{
        if (search == null || search.trim().length() == 0) {
            return db.itemDao().getAllItems();
        } else {
            return db.itemDao().findItemsBySearchTerm(search);
        }
    });

}

public LiveData<List<Item>> getItems() {
    return items;
}

public void setQuery(String queryText) {
   query.setValue(queryText);
}

}

11
Ved Agarwal

あなたはcallsetQuery(String queryText)少なくとも1回は必要です変換ドキュメントに従って

オブザーバーが返されたLiveDataオブジェクトを監視していない限り、変換は計算されません。変換はlazilyで計算されるため、追加の明示的な呼び出しや依存関係を必要とせずに、ライフサイクル関連の動作が暗黙的に渡されます。

そのため、アクティビティからsetQuery(String queryText)を呼び出さない場合、MutableLiveData<String> queryは更新されず、変換はトリガーされません。

アクティビティからの最初の呼び出しをavoidしたい場合は、次のように変換初期化の下で呼び出すことができます。

public MyListViewModel(Application application) {
    super(application);
    db  = MyDatabase.getInstance(application);
    items = Transformations.switchMap(query, (search)->{
        if (search == null || search.trim().length() == 0) {
            return db.itemDao().getAllItems();
        } else {
            return db.itemDao().findItemsBySearchTerm(search);
        }
    });
    setQuery("")
}

空の検索部分をトリガーし、All Itemsを返します。

また、あなたのケースで返されたデータをobserveする必要がありますitems。オブザーバーがデータを監視していない場合、トランザクションはトリガーされません。

私が Documentation から言及したように、これは私のために働いたいくつかのブログ

6
adityakamble49