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);
}
}
あなたは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 から言及したように、これは私のために働いたいくつかのブログ