簡體   English   中英

NotifyDataSetChanged無法正確更新RecyclerView

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM