Siddhpura Amit
Siddhpura Amit

Reputation: 15078

Using MutableLiveData, update data from Activity to Fragment

I have used SharedViewModel concept to pass data from Activity to Fragment

Like in Activity there is EditText, based on whatever I write in EditText, RecyclerView of Fragment should show filtered data.

ViewModel:

fun onSearchChanged(s: CharSequence, start: Int, before: Int, count: Int) {
    mutableChangedText.postValue(s.toString())
}

fun getSearchChangedText(): MutableLiveData<String> {
    return mutableChangedText
}

Fragment: I am observing data in Fragment using below method, but here it's not observing

private lateinit var sharedVM: SharedViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    fragmentBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_list_passwords, container, false)
    sharedVM = ViewModelProvider(this).get(SharedViewModel::class.java)
    fragmentBinding.appListViewModel = sharedVM
    observeSearchText()
    return fragmentListPasswordBinding.root
}
private fun observeSearchText() {
    sharedVM.getSearchChangedText().observe(viewLifecycleOwner, Observer {
        Log.d(TAG, "value = $it")
    })
}

MainActivity: If I use same code in Activity class where EditText is, it is working fine. private lateinit var sharedVM: SharedViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
    sharedVM = ViewModelProvider(this).get(SharedViewModel::class.java)
    activityMainBinding.appListViewModel = sharedVM

    observeSearchText()
}

private fun observeSearchText() {
    sharedVM.getSearchChangedText().observe(this, Observer {
        Log.d(TAG,"value = $it") 
    })
}

As per @Hein Htet Aung's answer if I change this to activity, I am getting below compile-time error

enter image description here

Answer:

Thanks to Hein Htet Aung

I got solution using below code in Fragment

sharedVM = ViewModelProvider(activity as MainActivity).get(SharedViewModel::class.java)

Upvotes: 4

Views: 1435

Answers (1)

Hein Htet Aung
Hein Htet Aung

Reputation: 854

Inside fragment, convert this line

sharedVM = ViewModelProvider(this).get(SharedViewModel::class.java)

to

sharedVM = ViewModelProvider(activity).get(SharedViewModel::class.java)

By using activity, viewmodelprovider will provide same viewmodel from activity

Upvotes: 4

Related Questions