1

ViewModel에서 LiveData 객체를 초기화하는 방법을 찾고 있습니다. 항목은 현재 활동에서 setQuery 메소드가 호출 될 때만 초기화됩니다.AndroidViewModel에서 LiveData 초기화

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

}

+0

당신이 활동에서 초기 호출을 피할 수 있도록 항목 변환 초기화 아래'setQuery를 ("")'를 호출 시도 – adityakamble49

답변

2

당신은

관찰자 않는을 계산하지 않는 변형에 반환 된 관찰됩니다setQuery(String queryText)적어도 한 번 변환 문서 당으로 호출해야 LiveData 객체. 변형은 지연적으로으로 계산되기 때문에 추가 명시 적 호출이나 종속성 없이도 수명주기 관련 동작이 암시 적으로 전달됩니다.

Activity에서 setQuery(String queryText)을 호출하지 않으면 MutableLiveData<String> query을 업데이트하지 않으며 변환을 트리거하지 않습니다.

당신이 에 활동에서 초기 호출을 피하려면 당신은 빈 검색 부분을 트리거하고 모든 항목를 반환합니다

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("") 
} 

,이 같은 변환 초기화 이하를 호출 할 수 있습니다.

items의 반품 된 데이터를 준수해야합니다. 관찰자가 데이터를 관찰하지 않으면 트랜잭션이 트리거되지 않습니다.

나는 Documentation에서 언급하고 몇 블로그이 나를 위해 일한으로