4

基本を設定し、更新して観察できるViewModelanを保存し、 として保存したいと思います。ArrayListLiveData

問題は、ビューモデルに添付されたフラグメントが、呼び出し時に ArrayList の変更を検出できないように見えることです.observe。アプリをデバッグすると、呼び出された ArrayLists2が実際に更新されていることがわかります。

これが私のViewModelです:

class MainViewModel : ViewModel() {
    private val _s1 = MutableLiveData<String>()
    private val _s2 = MutableLiveData<ArrayList<String>>()
    val s1: LiveData<String>
        get() = _s1
    val s2: LiveData<ArrayList<String>>
        get() = _s2

    init {
        _s1.value = "HELLO WORLD"
        _s2.value = arrayListOf("")
    }

    fun populateList() {
        _s2.value?.clear()
        for (i in 10 downTo 1) {
            _s2.value?.add("$i bottles")
        }
    }
}

および添付のフラグメント:

class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    private var message2TV: TextView? = null

    // ...

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)

        message2TV = view?.findViewById(R.id.message_2)

        viewModel.s1.observe(this, Observer {
            view?.findViewById<TextView>(R.id.message)?.text = it
        })

        viewModel.s2.observe(this, Observer {
            if (it != null && it.isNotEmpty()) {
                message2TV?.text = ""
                it.forEach { item -> message2TV?.append("\n$item") }
            }
        })

        message2TV?.setOnClickListener {
            viewModel.populateList()
        }
    }
}

viewModel.s2.observe()デバッグすると、ビューがクリックされた後(およびArrayListが更新された後)、再度呼び出されないこともわかりました。画面の向きを変更した場合にのみ、リストを表示することができます。

ここで何が欠けていますか?

4

1 に答える 1