【发布时间】:2022-01-02 19:30:56
【问题描述】:
我有两个回收站视图。在我使用notifyDataSetChanged 之前,我的视图不会更新。我要求类似类型的issue,但这次我有Github 链接。所以请看看并向我解释我做错了什么。谢谢
MainActivity.kt
package com.example.diffutilexample
import android.os.Bundle
import android.util.Log
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.example.diffutilexample.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<ActivityViewModel>()
private lateinit var binding: ActivityMainBinding
private var groupAdapter: GroupAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupViewModel()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel.fetchData()
binding.button.setOnClickListener {
viewModel.addData()
}
}
private fun setupViewModel() {
viewModel.groupListLiveData.observe(this) {
if (groupAdapter == null) {
groupAdapter = GroupAdapter()
binding.recyclerview.adapter = groupAdapter
}
groupAdapter?.submitList(viewModel.groupList?.toMutableList())
binding.recyclerview.post {
groupAdapter?.notifyDataSetChanged()
}
}
}
}
ActivityViewModel.kt
package com.example.diffutilexample
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class ActivityViewModel(app: Application) : AndroidViewModel(app) {
var groupListLiveData: MutableLiveData<Boolean> = MutableLiveData()
var groupList: ArrayDeque<Group>? = null
set(value) {
field = value
groupListLiveData.postValue(true)
}
var value = 0
fun fetchData() {
viewModelScope.launch {
val response = ApiInterface.create().getResponse()
groupList = groupByData(response.abc)
}
}
private fun groupByData(abc: List<Abc>?): ArrayDeque<Group> {
val result: ArrayDeque<Group> = groupList ?: ArrayDeque()
abc?.iterator()?.forEach { item ->
val key = GroupKey(item.qwe)
result.addFirst(Group(key, mutableListOf(item)))
}
return result
}
fun addData() {
groupList?.let { lastList ->
val qwe = Qwe("Vivek ${value++}", "Modi")
val item = Abc(type = "Type 1", "Adding Message", qwe)
val lastGroup = lastList[0]
lastGroup.list.add(item)
groupList = lastList
}
}
}
请在 Github 链接中找到整个代码。我附在上面
【问题讨论】:
-
在此行上方记录
groupListgroupAdapter?.submitList(viewModel.groupList?.toMutableList())。每次更改时检查是否记录了正确的数据。 -
@ArpitShukla 我记录了它,我的数据正在添加到列表中,如果我使用 notifyDataSetChanged 工作正常
-
notifyDataSetChanged 无法更改日志输出。您是否获得了正确的日志输出(有或没有) notifyDataSetChanged?
-
@ArpitShukla 是的,当我添加数据时,日志给了我正确的输出。有或没有)notifyDataSetChanged
-
我没有给出答案,而是质疑您为什么认为 DiffUtil 没有被触发?我敢打赌,调试代码的一种方法是在
areItemsTheSame()和areContentsTheSame()中添加日志记录点,以查看 DiffUtil 是否真的在尝试进行比较。如果您以 DiffUtil 认为没有任何改变的方式错误地实现了这些功能,那么显然 RecyclerView 将不会按您的预期显示更新的值。
标签: android kotlin android-recyclerview android-adapter android-diffutils