gpt4 book ai didi

java - RecyclerView 在尝试插入多个项目并通知适配器时抛出 IndexOutOfBoundsException

转载 作者:太空宇宙 更新时间:2023-11-04 10:41:31 26 4
gpt4 key购买 nike

我正在尝试从用户的通话记录中获取唯一号码并将其显示在 RecyclerView 中。我所说的“唯一”是指如果我在列表中显示过该号码或相应的联系人,则我必须跳过该项目。我想使用 Cursor 来显示此内容以使渲染更快。

为此,我实现了一个 RecyclerView 适配器,如下所示(仅显示相关代码,kotlin)

class CallAdapter(val activity: Activity, var cursor: Cursor) : RecyclerView.Adapter<CallAdapter.ViewHolder>() {


val handler = Handler()
val contacts = ArrayList<Contact>()

init {
cursor.moveToFirst()
UniqueLogs(this).start()
}

companion object {
const val TAG = "CallAdapter"
}

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(activity)
val binding = CallLogItemBinding.inflate(inflater, parent, false)
return ViewHolder(binding)
}

override fun getItemCount(): Int {
return contacts.count()
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val contact = contacts[position]

...

cursor.moveToNext()
}

class ViewHolder(val binding: CallLogItemBinding) : RecyclerView.ViewHolder(binding.root)

class UniqueLogs(val adapter: CallLogAdapterShobhit) : Thread() {
private var available = true
private val cursor = adapter.cursor
private val hash: HashMap<String, Int> = HashMap<String, Int>()
private val contacts = adapter.contacts
private var count = 0

override fun run() {
cursor.moveToFirst()
while (available && cursor.moveToNext()) {
var contact = adapter.getCurrentItemContact()

while (available && hash[contact.phoneNumber] == 1) {
if (cursor.moveToNext()) {
contact = adapter.getCurrentItemContact()
} else {
available = false
}
}

if (available) {
contacts.add(contact)
val position = count
count += 1

adapter.handler.post({
Log.d(TAG, "Position: $position Size: ${adapter.itemCount}")
adapter.notifyItemInserted(position)
})

hash[contact.phoneNumber] = 1
}
}

}
}
}

当我运行此代码时,我收到一个如下所示的异常:-

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{c75176c position=5 id=-1, oldPos=4, pLpos:4 scrap [attachedScrap] tmpDetached not recyclable(1) no parent}

每次的positionidoldPospLpos等都不同,但错误本质上是一样的。

我也尝试编写日志,以确保在将元素添加到 contacts 数组列表之前我不会尝试插入元素,但日志显示一切正常。

知道这里可能出了什么问题吗?

最佳答案

您正在后台线程中更新数据,但在主线程上进行通知。当通知发生时,您可能已经进一步更改了数据。我建议您在后台进行所有更新,然后在一切完成后执行通用的 notifyDataSetChanged

另一种选择是在后台线程中计算整个新列表,然后更新一次真实数据并在主线程中通知。

关于java - RecyclerView 在尝试插入多个项目并通知适配器时抛出 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927742/

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