Reputation: 15078
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
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
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