>

MVVM (매우 새로운 기능)을 찾으려고 노력하고 있으며 Room 및 ViewModel을 사용하여 LiveData를 관찰하는 방법을 알아 냈습니다. 이제 문제가 있습니다.

매개 변수가 필요한 Room 쿼리가 있는데 이것이 MainActivity의 onCreate에서 LiveData 관찰을 시작하는 방법입니다.

   String color = "red";
    myViewModel.getAllCars(color).observe(this, new Observer<List<Car>>() {
            @Override
            public void onChanged(@Nullable List<Car> cars) {
                adapter.setCars(cars);
            }
        });

이 코드를 사용하여 "빨간색"자동차 목록을 받고 RecyclerView를 목록으로 채 웁니다.

이제 내 질문에- color 를 변경하는 방법이 있습니까   getAllCars 내부 변수  방법 (예 : 버튼 클릭)으로 관찰자가 새로운 목록을 반환하도록 영향을 줍니까? 색상 변수 만 변경해도 아무런 변화가 없습니다.


  • 답변 # 1

    이 답변에서 언급했듯이 귀하의 솔루션은 Transformation.switchMap 입니다.

    Android for Developers 웹 사이트 :

    와이즈 비즈

    여러분의 상황에서는 다음과 같이 보일 것입니다 :

    LiveData< Y >switchMap (LiveData< X >trigger, Function< X, LiveData< Y >>func)

    Creates a LiveData, let's name it swLiveData, which follows next flow: it reacts on changes of trigger LiveData, applies the given function to new value of trigger LiveData and sets resulting LiveData as a "backing" LiveData to swLiveData. "Backing" LiveData means, that all events emitted by it will retransmitted by swLiveData.

    따라서 public class CarsViewModel extends ViewModel { private CarRepository mRepository; private LiveData<List<Car>> mAllCars; private LiveData<List<Car>> mCarsFilteredByColor; private MutableLiveData<String> filterColor = new MutableLiveData<String>(); public CarsViewModel (CarRepository carRepository) { super(application); mRepository = carRepository; mAllCars = mRepository.getAllCars(); mCarsFilteredByColor = Transformations.switchMap(filterColor, c -> mRepository.getCarsByColor(c)); } LiveData<List<Car>> getCarsFilteredByColor() { return mCarsFilteredByColor; } // When you call this function to set a different color, it triggers the new search void setFilter(String color) { filterColor.setValue(color); } LiveData<List<Car>>> getAllCars() { return mAllCars; } } 를 부르면  필터 색상 LiveData를 변경하면 setFilter 를 호출하는 Transformation.switchMap을 심사합니다.  그런 다음 쿼리 결과로 mCarsFilteredByColor LiveData를 업데이트하십시오. 따라서보기에서이 목록을 관찰하고 다른 색상을 설정하면 관찰자는 새 데이터를받습니다.

    작동하는지 알려주세요.

  • 답변 # 2

    @dglozano 답변 이외의 쉬운 방법은 mRepository.getCarsByColor(c)) 를 관찰하는 것입니다.   color 를 관찰하는 대신 . 그리고 list 에  와이즈 비츠 새 목록을 가져옵니다.

    예 :

    valueChange 에서  수업이 이러다

    color
    
    
    ViewModel 에서  이것을해라 :

    MutableLiveData<String> myColor = new MutableLiveData<String>();
    
    

    참고: 1. Activity   button.setOnClickListener(new OnClickListener() { public void onClick(View v) { myViewModel.myColor.setValue("newColor"); } }); myViewModel.myColor.observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String newValue) { // do this on dedicated thread List<Car> updateList = myViewModel.getCarsByColor(newValue) // update the RecyclerView } }); 로 포장 할 필요가 없습니다 . getCarsByColor() 의 방법   LiveData 를 반환 할 수 있습니다   Dao 대신 .

    2. 메인 스레드에서 db 쿼리를 실행하지 말고 List<Cars> 를 호출하십시오.  RecyclerView를 새로 고침합니다.

    LiveData<List<Cars>>

관련 자료

  • 이전 MySQL UNION은 일관되게 작동하지 않습니다 두 절의 posision을 바꾸면 결과가 서로 다릅니다
  • 다음 java - Maven을 사용한 Jmeter 테스트 자동화