我分别在两个方法中传递了相同的ArrayList,并在ViewModel中将它们设置为两个单独的ArrayList。当我更新一个(名称)ArrayList 但另一个(initialNames)ArrayList 也在更新时。为什么会发生这种情况?我该怎么做才能使initialNames 不会更新?
详细信息片段类:Fragment() {
private lateinit var binding: FragmentDetailsBinding
private var nameList:ArrayList<Name>? = null
private val detailsViewModel by viewModels<DetailsViewModel> (factoryProducer = {
object : ViewModelProvider.Factory{
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val database = LocalDatabase.getDatabase(requireContext())!!
val invoiceRepository = NameRepository(database)
return DetailsViewModel(invoiceRepository) as T
}
}
})
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
nameList = it.getParcelableArrayList("NAME")
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentDetailsBinding.inflate(layoutInflater)
nameList?.let {
detailsViewModel.setInitialName(it)
detailsViewModel.setName(it)
}
binding.btnUpdate.setOnClickListener {
detailsViewModel.updateList()
requireActivity().supportFragmentManager.popBackStack()
}
return binding.root
}
}
类DetailsViewModel(私有val nameRepository:NameRepository):ViewModel(){
private var names = arrayListOf<Name>()
private var initialNames = arrayListOf<Name>()
var name = MutableStateFlow<String>("")
fun setName(names:ArrayList<Name>){
this.names = names
}
fun setInitialName(names:ArrayList<Name>){
this.initialNames = names
}
fun updateList(){
Log.d(TAG, "updateList: $initialNames") //Here list is same as first time set.
for (name in names){
if (name.id == 2){
name.name = "New Name"
}
}
Log.d(TAG, "updateList: $initialNames") //Here list changed.
}
}
我修改了片段中的代码
detailsViewModel.setInitialName(it)
val newList = it.map { it.copy() }
detailsViewModel.setName(ArrayList(newList))
这样我解决了我的问题。