tyrael864
tyrael864

Reputation: 31

Changing LiveData in Activity doesn't notify observer in child Fragment

I'm trying to update LiveData object in activity that hosts a fragment and then I want to update the fragment's UI after observing it. The problem is the fragment's ui only updates when fragment is restarted. What can I do to achievie real-time update of Ui in fragment every time the data changes in activity?

// Activity code:

   transactionViewModel = ViewModelProviders.of(this, providerFactory).get(TransactionViewModel.class);  
transactionViewModel.getUserValues();

/// Fragment:

    transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); 
viewModel.userValues.observe(getActivity(), userValues -> {  if(userValues.data != null){}//update the ui }

Upvotes: 1

Views: 658

Answers (2)

EpicPandaForce
EpicPandaForce

Reputation: 81529

Fragment code

transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); 

viewModel.userValues.observe(getActivity(), userValues -> {  
   if(userValues.data != null) {
       //update the UI 
   }
}

Should be

transactionViewModel = ViewModelProviders.of(getActivity(), providerFactory).get(TransactionViewModel.class); 

// this goes in onViewCreated
viewModel.userValues.observe(viewLifecycleOwner, userValues -> {  
    if(userValues.data != null){
         //update the ui
    }
}

Upvotes: 0

ObinasBaba
ObinasBaba

Reputation: 530

To achievie "real-time update of Ui" i sugesst using data-binding.

In your code, I think you are observing a deferent reference of viewModel.

Try observing after casting your activity(am using kotlin here):

        val myActivity = (requireActivity() as MainActivity)
        myActivity.transactionViewModel.viewModel.userValues.observe(getActivity(), userValues -> { 
        if(userValues.data != null){}//update the ui }

Upvotes: 1

Related Questions