Android ViewModel 观察 MutableLiveData<ArrayList<String>>
Android ViewModel Observe MutableLiveData<ArrayList<String>>
我在一个片段中有一个表格布局。选项卡布局有 3 个选项卡。哪个选项卡有片段。
并且,在第一个片段中,我插入了一个字符串并将其添加到 viewModel MutableLiveData<ArrayList>>
变量中。
然后,我要在第三个片段中观察。
我的主要 ViewModel:
class MainViewModel : ViewModel() {
val message = MutableLiveData<ArrayList<String>>(arrayListOf())
fun myMessage(msg: String) {
message.value?.add(msg)
}
}
第三个片段:
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
}
}
我的第一个片段:
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
}
}
当我打开第三个片段时,它按计划观察。当我回到第一个 Fragment 并向数组列表中添加更多字符串时,第三个不再观察到,我不知道为什么。
第一个观察者:
我的布局:
我的观察者只观察一次
您必须更改实时数据的值,而不是仅仅将项目添加到已设置的列表中。
将函数 myMessage
更改为:
fun myMessage(msg: String) {
val list = message.value
list.add(msg)
message.value = list
}
这将获取您现有的列表,然后添加您的新项目,然后设置实时数据的值以便调用观察。
我在一个片段中有一个表格布局。选项卡布局有 3 个选项卡。哪个选项卡有片段。
并且,在第一个片段中,我插入了一个字符串并将其添加到 viewModel MutableLiveData<ArrayList>>
变量中。
然后,我要在第三个片段中观察。
我的主要 ViewModel:
class MainViewModel : ViewModel() {
val message = MutableLiveData<ArrayList<String>>(arrayListOf())
fun myMessage(msg: String) {
message.value?.add(msg)
}
}
第三个片段:
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
}
}
我的第一个片段:
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
}
}
当我打开第三个片段时,它按计划观察。当我回到第一个 Fragment 并向数组列表中添加更多字符串时,第三个不再观察到,我不知道为什么。
第一个观察者:
我的布局:
我的观察者只观察一次
您必须更改实时数据的值,而不是仅仅将项目添加到已设置的列表中。
将函数 myMessage
更改为:
fun myMessage(msg: String) {
val list = message.value
list.add(msg)
message.value = list
}
这将获取您现有的列表,然后添加您的新项目,然后设置实时数据的值以便调用观察。