Я хочу установить базовый ViewModel
и сохранить ArrayList
, который можно обновлять и, таким образом, наблюдать, сохраняя его как LiveData
.
Проблема заключается в том, чтоприкрепленный фрагмент ViewModel не может обнаружить изменения в моем ArrayList при вызове .observe
для него.Хотя, когда я отлаживаю приложение, я вижу, что ArrayList, называемый s2
, действительно обновился.
Вот мой 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()
больше не вызывается после нажатия View (и обновления ArrayList).Я могу заставить его отображать список, только если я изменю ориентацию экрана.
Пожалуйста, что мне здесь не хватает?