gpt4 book ai didi

android - PagedListAdapter.submitList() 在更新现有项目时表现异常

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:42 24 4
gpt4 key购买 nike

本主题的小故事:应用程序在确认后仅通过对话框更新单击行的值。在房间数据库上使用分页方案。

当一个项目被添加或删除时,最新的数据集被获取并传递给 submitList 方法,然后所有的变化都会被看到并且运行良好。

问题从这里开始,如果现有项目更新,则会再次正确获取最新数据集并传递给 submitList,但这次似乎没有更改。

当我调试 DIFF_CALLBACK 并在 areItemsTheSame 中捕获我的项目时,newHistoryoldHistory 值相同! (如何!)

submitList 方法中可能存在任何错误?

  • 房间 v.:2.1.0-alpha02
  • 分页版本:2.1.0-beta01

初始化后,observe 从 room 中获取列表并传递给 mHistoryAdapter.submitList(it)。然后,如果我更新一个项目,观察将再次触发(并且我在参数 it 中看到更新的值)并传递给 submitList

不幸的是,适配器不会改变...

    mResolvedAddressViewModel = ViewModelProviders.of(this).get(ResolvedAddressViewModel::class.java)
mResolvedAddressViewModel.getAddresses(false).observe(this, Observer {
mHistoryAdapter.submitList(it)
})

所有部分

模型

@Parcelize
@Entity
data class ResolvedAddress(
@PrimaryKey var id: String = UUID.randomUUID().toString(),
var requestedLat: Double = 0.0,
var requestedLon: Double = 0.0,
var requestedAddress: String = "",
var lat: Double,
var lon: Double,
var address: String,
var country: String,
var countryCode: String,
var city: String,
var alias: String? = null,
var favorite: Boolean = false,
var provider: String? = null,
var lastUseDate: Long = 0L) : Parcelable

适配器

class HistoryAdapter(var context: Context)
: PagedListAdapter<ResolvedAddress, HistoryItemHolder>(DIFF_CALLBACK) {

companion object {
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<ResolvedAddress>() {
override fun areItemsTheSame(
oldHistory: ResolvedAddress, newHistory: ResolvedAddress): Boolean {
return oldHistory.id == newHistory.id
}

override fun areContentsTheSame(
oldHistory: ResolvedAddress, newHistory: ResolvedAddress): Boolean {
return oldHistory == newHistory
}
}
}
}

fragment

class HistoryFragment : Fragment() {
private lateinit var mHistoryAdapter: HistoryAdapter
private lateinit var mResolvedAddressViewModel: ResolvedAddressViewModel

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_history, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerViewHistory.setHasFixedSize(true)
recyclerViewHistory.layoutManager = LinearLayoutManager(activity)
recyclerViewHistory.itemAnimator = DefaultItemAnimator()

mHistoryAdapter = HistoryAdapter(context!!)
recyclerViewHistory.adapter = mHistoryAdapter

mResolvedAddressViewModel = ViewModelProviders.of(this)
.get(ResolvedAddressViewModel::class.java)

mResolvedAddressViewModel.getAddresses(false).observe(this, Observer {
mHistoryAdapter.submitList(it)
})
}
}

最佳答案

问题中缺少一些有助于提供更详细答案的内容。

例。你的 RecyclerView.Adapter 是什么样子的?它是否扩展了 PagedListAdapter

你的模型类是什么样的?它是 Kotlin 数据类吗?


为了提供答案,我们假设这些未知数是我们所期望的。

如果我理解这个问题,您似乎只是在更新 一个项目,而不是删除或添加任何项目。因此,DiffUtil.ItemCallbackareItemsTheSame 将始终返回 true,因为旧列表和新列表的大小尚未修改。意思是,如果您更新了一个项目,您可能已经更新了它的内容,而不是将其从列表中删除。

因此,areItemsTheSame 将返回 true,因为它们的 id 仍然相同。

第二种方法 areContentsTheSame 更有可能返回 false,因为您已经更新了项目的内容。

如果您的模型类 ResolvedAddress 是 Kotlin 数据类,则方法 areContentsTheSame 应该在比较从旧列表更新的项目和新列表时返回 false新列表。这应该在此时触发适配器中的 onBindViewHolder 方法,以便您使用更新的数据重新绑定(bind)该项目。

如果该模型不是 Kotlin 数据类,那么您必须确保该类实现了 compareTo 方法。如果不是,则您正在比较对象的内存地址与对象的实际内容。如果是这种情况,方法 areContentsTheSame 将始终返回 true,因为对象的内存地址没有改变。

这些是一些调试技巧,因为如果不了解代码是如何实现的,就很难提供更清晰的答案。

关于android - PagedListAdapter.submitList() 在更新现有项目时表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com