【发布时间】:2023-04-02 14:40:01
【问题描述】:
我在 Android Kotlin 中使用 DiffUtil 和 ListAdapter。我在 onResume 方法中从服务器调用数据。当 onResume 调用每个项目时,整个数据正在重绘视图。如果服务器端有任何数据更改,我想更新视图,因此它将反映在应用程序中。
ListActivity.kt
class ListActivity : BaseActivity() {
lateinit var binding: ListActivityLayoutBinding
private val viewModel: ListViewModel by inject()
private var listAdapter: listAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupViewModel()
binding = ListActivityLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
}
private fun setupViewModel() {
viewModel.liveData.observe(this, { list ->
setupAdapter(list)
})
}
private fun setupAdapter(list: List<XYZ>) {
initializeAdapter()
listAdapter?.submitList(list)
binding.recyclerView.adapter = listAdapter
}
private fun initializeAdapter() {
viewModel.abc?.let { abc ->
listAdapter = ListAdapter(abc, object : Listener<XYZ> {
override fun selectedItem(item: XYZ) {
// calling
}
}
})
} ?: run {
Log.e("Error", "Error for fetching data")
}
}
override fun onResume() {
super.onResume()
viewModel.fetchData()
}
}
XYZ.kt
data class XYZ(
val id: String? = null,
val title: String? = null,
val count: Int? = null,
val status: String? = null,
val item: Qqq? = null
)
QQQ.kt
data class Qqq(
val id: String? = null,
val rr: Rr? = null
)
Rr.kt
data class Rr(
val firstName: String? = null,
val lastName: String? = null,
)
ListAdapter.kt
class ListAdapter(
private val abc: Abc,
private val listener: Listener <XYZ>
) : ListAdapter<XYZ, ListViewHolder>(LIST_COMPARATOR) {
companion object {
private val LIST_COMPARATOR = object : DiffUtil.ItemCallback<XYZ>() {
override fun areItemsTheSame(oldItem: XYZ, newItem: XYZ): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: XYZ, newItem: XYZ): Boolean {
return ((oldItem.title == newItem.title) && (oldItem.status == newItem.status)
&& (oldItem.count == newItem.count)
&& (oldItem.item == newItem.item))
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
return ListViewHolder.bindView(parent, abc)
}
override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
holder.bindItem(getItem(position), listener)
}
}
ListViewModel.Kt
class ListViewModel : BaseViewModel() {
var abc: Abc? = null
private var xyz: List<XYZ>? = null
var liveData: MutableLiveData<List<XYZ>> = MutableLiveData()
fun fetchData() {
viewModelScope.launch {
val firstAsync = async {
if (abc == null) {
abc = getAbc() // First retrofit call
}
}
val secondAsync = async {
xyz = getXYZ() // Second retrofit call
}
firstAsync.await()
secondAsync.await()
liveData.postValue(xyz)
}
}
}
注意,我想检查 abc 在每次调用中是否为空。
1.我的 DiffUitll 回调是否正确?
2. 第一次初始调用我想重绘每个项目,但是,如果我在onResume 中调用viewModel.fetchData(),如果有任何我需要做的更改,否则我不想重画我的整个清单。有什么建议吗?
【问题讨论】:
-
似乎您在每次通话后都在创建一个新适配器。您应该创建并设置您的适配器 onCreate 并发布一个新列表以计算差异。
-
@Kdaydin 你能给我一个例子吗?每次都需要调用一件事
initializeAdapter()函数,因为viewmodel.abc每次都会检查该值是否为空。
标签: android kotlin android-recyclerview android-adapter android-diffutils