Удалить все liveData и выбранный наблюдатель на Spinner - PullRequest
0 голосов
/ 19 июня 2020

Сценарий У меня есть Spinner и RecyclerView. У счетчика есть три различных варианта: VIP-пользователи , Новые пользователи , Пользователи с высокими показателями . В myViewModel

private liveData<ArrayList<User>> userList;
public void init(int position){
switch (position){
  case 0: 
    userList = myRepo.getInstance().getVipUser();
  break;

  case 1:
  userList = myRepo.getInstance().getNewUser();
 break;

 case 2:
 userList = myRepo.getInstance().getHScoreUser();
 break;
 }}

 public LiveData<ArrayList<User>> getUserList(){return userList;}

И в myFragment

spinner.setOnItemSelectedListener(this);

 public void onItemSelected(AdapterView<?> parent, View view, int pos,long id) {
myViewModel.getUserList().removeObserver(getViewLifeCycleOwner ());
myViewModel.init(pos);

myViewModel.getUserList().observe(getViewLifeCycleOwner(), 
 userList->{
      //Attach userList to RecyclerView
          }
 }  

Все прошло нормально. Но когда я выбираю другие варианты на Spinner. Пример, когда я меняю VIP-пользователь на High Score User , livdata также учитывает старые данные. Если user1,2,3 являются VIP-пользователями, а user4,5 - пользователями с высоким рейтингом, все 5 пользователей отображаются в разделе «Пользователи с высоким рейтингом» вместо отображения только user4,5.

Итак, я хочу удалить предыдущие данные из liveata при изменении выбора прядильщика. Есть ли способ выполнить sh это?

1 Ответ

1 голос
/ 19 июня 2020

я бы использовал switchMap в liveata. Так что в основном у меня было бы что-то вроде этого:

MutableLiveData userTypeLiveData = MutableLiveData<Int>;
LiveData userLiveData = Transformations.switchMap(userTypeLiveData, userType ->

    myRepo.getInstance().getUsersByType(userType);
)

void selectUser(int userType) {
     this.userTypeLiveData.setValue(userType);
}

И я бы добавил переключатель в класс репозитория

...