![](/img/trans.png)
[英]Why Does RecyclerView Update Without notifyDataSetChanged()?
[英]NotifyDataSetChanged does not update the RecyclerView correctly
我正在嘗試在我的recyclerview適配器中實現一個相當基本的邏輯,但是notifyDataSetChanged()
給我帶來了很大的麻煩。
我有一個看起來像這樣的過濾器方法:
fun filter(category: Int) {
Thread(Runnable {
activeFiltered!!.clear()
if (category == -1) {
filterAll()
} else {
filterCategory(category)
}
(mContext as Activity).runOnUiThread {
notifyDataSetChanged()
}
}).start()
}
filterAll()
和filterCategory()
函數非常簡單:
private fun filterAll() {
activeFiltered?.addAll(tempList!!)
}
private fun filterCategory(category: Int) {
for (sub in tempList!!) {
if (sub.category == category) {
activeFiltered?.add(sub)
}
}
}
當我運行此代碼並按類別過濾列表時,activeFiltered列表會正確更新並包含我期望的項目,但是當notifyDataSetChanged()
運行時,它只會切出列表的范圍而不更新項目。
有沒有辦法解決這個問題?
我也嘗試過,而不是使用notifyDataSetChanged():
activeFiltered!!.forEachIndexed {index, _ -> notifyItemChanged(index)}
但是問題仍然存在。
這也不是線程問題,因為我嘗試將整個邏輯放入主線程,並且列表仍未正確更新。
這是我的onBindViewHolder()
:
override fun onBindViewHolder(viewHolder: ActiveViewHolder, pos: Int) {
sub = activeFiltered!![pos]
inflateView()
}
這是我在onBindViewHolder()
文本的地方,sub是在onBindViewHolder()
設置的實例變量:
private fun inflateView() {
viewHolder.title.text = sub.title
}
似乎onBindViewHolder()
的實現不正確。 為了更新列表項,應該使用傳入的viewHolder
參數(而不是您在onCreateViewHolder()
創建的viewHolder
)。
正確的實現應該像
override fun onBindViewHolder(viewHolder: ActiveViewHolder, pos: Int) {
val sub = activeFiltered!![pos]
inflateView(viewHolder, sub)
}
private fun inflateView(viewHolder: ActiveViewHolder, sub: <YourDataType>) {
viewHolder.title.text = sub.title
}
順便說一句,將某些內容保留為成員字段以幾種方法訪問它不是一個好習慣。 隨時將其作為此類方法的參數傳遞。 在上面的代碼中,我將sub
作為參數傳遞,而不是將其存儲為成員。
而且也不必保留在onCreateViewHolder()
創建的viewHolder
。 我們通常在某些回調方法(例如onBindViewHolder()
等)中需要它們,並且這些方法將接收正確的viewHolder
作為參數。
我認為您是在onBindView()
中使用原始數組,而不是經過過濾的數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.