ViewModel 中的 ArrayList 自动更新

问题描述 投票:0回答:1

我分别在两个方法中传递了相同的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.

}

}

android kotlin arraylist mvvm viewmodel
1个回答
0
投票

我修改了片段中的代码

detailsViewModel.setInitialName(it)
val newList = it.map { it.copy() }
detailsViewModel.setName(ArrayList(newList))

这样我解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.