LiveData наблюдает за сменой вкладки - PullRequest
0 голосов
/ 12 июля 2020

У меня проблема с использованием LiveData.

Сценарий ...

У меня BottomNavigationView с 4 вкладками. Форум, Сообщение, Пользователи, Аккаунт . Каждый соединяется с фрагментом ViewPager. Каждый фрагмент имеет свою собственную модель представления, модель и репозиторий. Я загружаю данные из базы данных в RecyclerView Users Fragment. Работает нормально. Но когда я перелистываю viewPager на другую вкладку, мой список пользователей удваивается. Фактически, он загружает только последний наблюдаемый элемент дважды. Например ... если user5 является последним элементом при извлечении, когда я возвращаюсь из другого фрагмента вкладки, в списке есть два user5. Больше раз я меняю свои вкладки, много раз наблюдаю за последним элементом.

Это мой Users_Fragment.class

public class Users_Fragment extends Fragment{
   private ArrayList<Users> user_info_list;
   private UserFragment_ViewModel userFragment_viewModel ;

   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState); 
   }

   @Override
   public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
     mainView = inflater.inflate(R.layout.user_fragment, container ,false);
     userFragment_viewModel = new ViewModelProvider(this).get(UserFragment_ViewModel.class);

     user_info_list = new ArrayList<>();

     initiate();
     fetchUsers();
     return mainView;
   }
  
   private void initiate(){
       // declare RecyclerView and some status checking code
   }

   private void fetchUsers() {
     // fetch user to recyclerview
     user_info_list.clear();
     recyclerView.setHasFixedSize(true);
     LinearLayoutManager layoutManager
                = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
     recyclerView.setLayoutManager(layoutManager);
        
     userFragment_viewModel.initiate(); // start retrieving from database with repository and load it
     userFragment_viewModel.getPeople_list()
                           .removeObservers(getViewLifecycleOwner());

     userFragment_viewModel.getPeople_list()
                           .observe(getViewLifecycleOwner(), usermodel -> {
                              user_info_list.add(usermodel);
                              userAdapter.notifyDataSetChanged();
                           });
     userAdapter = new UserAdapter(getContext(),user_info_list);
     recyclerView.setAdapter(userAdapter);
  }
}

А это мой UserFragment_ViewModel.class

public class UserFragment_ViewModel extends ViewModel {
     
  private LiveData<UserModel> people_list_info ;

  public void initiate() {
    people_list_info = Users.getInstance().getUser_live_data();
  }

  public LiveData<UserModel> getPeople_list() {
    return people_list_info;
  }
}

Как это решить? Почему мой последний объект наблюдения снова и снова становится Наблюдаемым при смене вкладки?

...