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