Hernâni Pereira
Hernâni Pereira

Reputation: 324

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.

Upvotes: 3

Views: 3250

Answers (1)

Antonio
Antonio

Reputation: 1274

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.

Upvotes: 5

Related Questions