Observe LiveData instance in fragment and activity
14,540
Solution 1
in class MyViewModel create
val userLiveData =MutableLiveData<User>()
and getter
fun getUserLiveData(id: String): MutableLiveData<User> {
return userLiveData
}
fun getUser(id: String){
val disposableUser = repository.getUser(id)
.subscribe({
userLivedata.postValue(it)
})
}
And in activity or Fragment called
myViewModel.getUserLiveData.observe(this, Observer { it ->
//TODO
})
myViewModel.getUser(...)
And Now in ViewModel you have object User (userLiveData.getValue())
Solution 2
Write method in Activity doSomethingWithUser(user: User)
And in your livedata
myViewModel.getUser(editText.text.toString()).observe(this, Observer { it ->
(requireActivity() as MainActivity).doSomethingWithUser(it)
})
Author by
Nelson Almendra
Updated on July 30, 2022Comments
-
Nelson Almendra almost 2 years
I have a simple scenario where I do something in fragment and when I receive the LiveData I want to do something in Activity.
ViewModel:
class MyViewModel(application: Application) : AndroidViewModel(application) { ... fun getUser(id: String): LiveData<User> { return repository.getUser(id) } }
Fragment:
class MyFragment : Fragment() { private lateinit var myViewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) activity?.run { myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java) } ?: throw Exception("Invalid Activity") } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) button.setOnClickListener { showProgressBar() myViewModel.getUser(editText.text.toString()).observe(this, Observer { it -> //TODO }) } } }
Activity:
class MainActivity : AppCompatActivity() { private lateinit var myViewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java) //Here I would like to observe the user instance returned from the getUser() method } }
So the issue I'm having is that I would like to have an instance of
LiveData<User>
inMyViewModel
so that I could observe it in Activity and Fragment. How can I achieve this?