使用 MVVM 导航到其他片段时,recyclerview 中的列表会重复

The list in recyclerview is getting duplicated when navigating to other fragment with MVVM

当导航到其他片段并返回片段时,recyclerview 中的列表内容会重复。

当用户点击项目并导航回同一片段时,recyclerview 会重复

视图模型:

    private var listMutableLiveData: MutableLiveData<ArrayList<OffersModelClass>> =
    MutableLiveData()  

    var arrayListMainUI: ArrayList<OffersModelClass> = ArrayList()

    val listLiveData: LiveData<ArrayList<OffersModelClass>>
        get() = listMutableLiveData
    

    fun loadData(reload: Boolean) {
    if (reload) {
        databaseReference.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                for (data in snapshot.children) {

                    val model = data.getValue(OffersModelClass::class.java)

                    //Getting the offer ID to load its images
                    val imageID: String = model?.imageID.toString()

                    val fileRef11 = FirebaseStorage.getInstance().reference.child(
                        "offers/$imageID.jpg"
                    )
                    fileRef11.downloadUrl.addOnSuccessListener { uri ->

                        //Assigning the image uri and converting it to string
                        model?.ImageUri = uri.toString()

                        //Assigning the new time format
                        model?.Time = model?.Time?.let { calculateTimeAge(it) }

                        //Adding the data to arraylist as whole to observe it from the fragment
                        arrayListMainUI.add(model as OffersModelClass)
                        listMutableLiveData.postValue(arrayListMainUI)

                    }
                }

            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }
        })
    }
}

片段:

    recyclerView.layoutManager = LinearLayoutManager(context)
    recyclerView.setHasFixedSize(true)

    viewModel = ViewModelProvider(requireActivity()).get(ViewModel::class.java) 

     if (user != null) {
        // User is signed in
         viewModel.loadData(true)
       
    }
    viewModel.listLiveData.observe(viewLifecycleOwner, { arrayList ->
        offerAdapter = OfferAdapter(arrayList)
        recyclerView.adapter = offerAdapter
        offerAdapter.notifyDataSetChanged()
    })

在 onDataChanged 之前调用 arrayListMainUI.clear() for (data in snapshot.children)。为什么这会起作用? 答案: 当您导航回片段时,您并没有创建 arrayListMainUI 的另一个实例。因此,以前的数据不会被清除,新的数据会与以前的数据一起添加,从而创建重复列表。