Сохранение состояния фрагмента при просмотре с помощью LiveData

#android

#Android

Вопрос:

Я сохраняю состояние фрагмента в представлении, оно работает так, как я ожидал, проблема связана с LiveData. Когда я перехожу к другому фрагменту, а затем возвращаюсь к этому фрагменту, я больше не могу наблюдать за изменениями. Это код моего onCreateView ():

     @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if(view == null){
            view = inflater.inflate(R.layout.fragment, container, false);
            initializeViews(view);
            receivedProductViewModel.getProductMutableLiveData().observe(getViewLifecycleOwner(), new Observer<DispatchedProduct>() {
                @Override
                public void onChanged(DispatchedProduct dispatchedProduct) {
                    if(dispatchedProduct != null){
                        int index = dispatchedProducts.indexOf(dispatchedProduct);
                        dispatchedProductsAdapter.notifyItemChanged(index);
                    }
                }
            });
            btnSearch.setOnClickListener(btnSearchListener());
            btnRegister.setOnClickListener(btnRegisterListener());
            initializeRV();
        }
        return view;
    }
  

Я инициализирую виртуальную машину в onCreate ():

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        receivedProductViewModel = new ViewModelProvider(getActivity()).get(ReceivedProductViewModel.class);
    }
  

Ответ №1:

Переместите свой observe внешний if (view == null) блок. Вам всегда нужно создавать нового наблюдателя для вашего представления при каждом onCreateView вызове — предыдущий getViewLifecycleOwner() был уничтожен при onDestroyView вызове предыдущего, что корректно останавливает ваш предыдущий observe обратный вызов.

 @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if(view == null){
        view = inflater.inflate(R.layout.fragment, container, false);
        initializeViews(view);
        btnSearch.setOnClickListener(btnSearchListener());
        btnRegister.setOnClickListener(btnRegisterListener());
        initializeRV();
    }
    receivedProductViewModel.getProductMutableLiveData().observe(
         getViewLifecycleOwner(), new Observer<DispatchedProduct>() {
            @Override
            public void onChanged(DispatchedProduct dispatchedProduct) {
                if(dispatchedProduct != null){
                    int index = dispatchedProducts.indexOf(dispatchedProduct);
                    dispatchedProductsAdapter.notifyItemChanged(index);
                }
            }
    });
    return view;
}