如何解决属性值在ViewModel中更改,然后在RecyclerViewAdapter中更新
我所拥有的是一个ViewModel,一个片段和一个RecyclerViewAdapter。
用例如下:
- 用户想要更改RecyclerView中一项的名称。
- 他的命令发送到ViewModel。
- ViewModel使用LiveData更新项目和postValue
- Fragment观察live属性,并向RecyclerViewAdapter发送命令以更新列表。
- 列表已更新。
仅包含我检查过的方法的代码段对该问题有效。
data class Name(
var firstName: String = "",var lastName: String = "",)
class NameListRecyclerViewAdapter : RecyclerView.Adapter<NameListRecyclerViewAdapter.ListViewHolder>() {
private var names: List<Name> = listOf()
fun setData(newList: List<Name>) {
names = newList
notifyDataSetChanged()
}
}
class NameListViewModel : ViewModel() {
private var names: MutableList<Name>? = null
private val _nameList = MutableLiveData<MutableList<Name>>()
val nameList: LiveData<MutableList<Name>>
get() = _nameList
fun changeFirstName(index: Int,name: String) {
names?.get(0)?.firstName = name // in this very moment the names property in NameListRecyclerViewAdapter is being changed
_nameList.postValue(names)
}
}
class NamesListFragment : Fragment() {
private lateinit var viewModel: NameListViewModel
private lateinit var recyclerViewAdapter: NameListRecyclerViewAdapter
override fun onViewCreated(
view: View,savedInstanceState: Bundle?
) {
viewModel = ViewModelProvider(
requireActivity(),NameListViewModelFactory(requireActivity().applicationContext)
).get(NameListViewModel::class.java)
recyclerViewAdapter = NameListRecyclerViewAdapter()
recycler_view_layout.apply {
setHasFixedSize(true)
layoutManager =
LinearLayoutManager(context).apply {
orientation = LinearLayoutManager.VERTICAL
}
adapter = recyclerViewAdapter
}
viewModel.nameList.observe(
viewLifecycleOwner,Observer {
val result = it ?: return@Observer
recyclerViewAdapter.setData(result)
}
)
}
}
第一次更改名称,但第二次更改很奇怪。
名称(RecyclerViewAdapter中的属性)不是在应该(在步骤5中)时而是在步骤3中(即使在使用liveData发布新值之前)进行更新。
我的理论是,ViewModel和RecyclerViewAdapter中的列表相同,但是我不知道为什么,为什么一个不是另一个的副本?
更新,当我在ViewModel中按如下所示添加.toMutableList()时,该问题似乎已解决:
class NameListViewModel : ViewModel() {
//...
fun changeFirstName(index: Int,name: String) {
names?.get(0)?.firstName = name
_nameList.postValue(names.toMutableList()) // instead of simple _nameList.postValue(names)
}
}
这是否意味着实时数据属性具有完全相同的列表,我必须确保始终复制它?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。