Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ViewModel Observe MutableLiveData<ArrayList<String>>

I have a tablayout inside a fragment. The tab layout has 3 tabs. Which tab has a fragment. And, in the first fragment I insert a string and add it to a viewModel MutableLiveData<ArrayList>> variable. Then, I want to observe in the third fragment. My main ViewModel:

class MainViewModel : ViewModel() {
val message = MutableLiveData<ArrayList<String>>(arrayListOf())

fun myMessage(msg: String) {
    message.value?.add(msg)
}
}

Third Fragment:

class Fragment3 : Fragment() {

lateinit var model: MainViewModel

private lateinit var viewModel: MainViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view= inflater.inflate(R.layout.fragment3_fragment, container, false)

    model = activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) }!!

    model.message.observe(viewLifecycleOwner, Observer {
        Log.e("aqui", "aqui$it")
    })
    return view
}
}

My first Fragment:

class Fragment1 : Fragment() {

lateinit var model: MainViewModel


private lateinit var viewModel: MainViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view=  inflater.inflate(R.layout.fragment1_fragment, container, false)
    model = activity?.let { ViewModelProvider(it).get(MainViewModel::class.java) }!!
    var btnTest= view.findViewById<Button>(R.id.btn_test)
    btnTest.setOnClickListener {
        model.myMessage(et_text.text.toString())
    }

    return view
}
}

When I open the Third fragment it observes as planned. When I come back to first Fragment and add more Strings to the array list, the third does not observes again, I don't know why.

First Observer:

enter image description here

My layout:

enter image description here

My observer only observes once.

like image 471
Hernâni Pereira Avatar asked Dec 01 '25 02:12

Hernâni Pereira


1 Answers

You have to change the value of the live data instead of just adding an item to the already set list.

Change your function myMessage as:

fun myMessage(msg: String) {
    val list = message.value
    list.add(msg)
    message.value = list
}

This will take your existing list then add your new item and then set the value of the live data so that the observe will be called.

like image 141
Antonio Avatar answered Dec 02 '25 17:12

Antonio



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!