使用 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 的另一个实例。因此,以前的数据不会被清除,新的数据会与以前的数据一起添加,从而创建重复列表。
当导航到其他片段并返回片段时,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 的另一个实例。因此,以前的数据不会被清除,新的数据会与以前的数据一起添加,从而创建重复列表。