簡體   English   中英

在Android Recyclerview中的notifyitemmoved()之后,OnBindViewHolder不適用

[英]OnBindViewHolder does not apply after notifyitemmoved () in Android Recyclerview

上面的代碼是RecyclerViewAdapter,它僅在第一個項目時更改顏色,如下所示。

class TestAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val textColor1 = Color.BLACK
private val textColor2 = Color.YELLOW
private val items = ArrayList<String>()

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    val textColor = if(position==0) textColor1 else textColor2
    holder.itemView.textView.setTextColor(textColor)
    holder.itemView.textView.text = items[position]
}

fun move(from:Int,to:Int){
    val item = items[from]
    items.remove(item)
    items.add(to,item)
    notifyItemMoved(from,to)
}
}

在此輸入圖像描述

在這種狀態下,我想使用移動功能將值3移動到第一個位置。 我想要的結果如下所示。

在此輸入圖像描述

但事實上,它顯示了以下結果

在此輸入圖像描述

使用notifyDataSetChanged時,我看不到動畫過渡效果,

使用findViewHolderForAdapterPosition手動運行onBindViewHolder會產生我想要的結果,但它非常不穩定。 (導致錯誤的其他部分,我沒有修復)

fun move(from:Int,to:Int){
    val item = items[from]
    val originTopHolder = recyclerView.findViewHolderForAdapterPosition(0)
    val afterTopHolder = recyclerView.findViewHolderForAdapterPosition(from)
    items.remove(item)
    items.add(to,item)
    notifyItemMoved(from,to)
    if(to==0){
        onBindViewHolder(originTopHolder,1)
        onBindViewHolder(afterTopHolder,0)
    }
}

有沒有其他方法可以解決這個問題?

使用各種notifyItemFoo()方法(如notifyItemFoo() / inserted / removed)不會重新綁定視圖。 這是設計的。 你可以打電話

if (from == 0 || to == 0) {
    notifyItemChanged(from, Boolean.FALSE);
    notifyItemChanged(to, Boolean.FALSE);
}

為了重新綁定移動的視圖。

notifyItemMoved不會更新它。 根據文件:

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter

這是一個結構變化事件。 數據集中其他現有項目的表示仍然被認為是最新的,並且不會反彈,盡管它們的位置可能會改變。

你所看到的是預期的。

可能想要研究使用notifyItemChanged,或者仔細閱讀文檔,看看什么最適合你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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