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

时间:2018-09-12 01:46:44

标签: android 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)
}
}

enter image description here

在这种状态下,我想使用移动功能将值3移动到第一个位置。我想要的结果如下所示。

enter image description here

但实际上,它显示了以下结果

enter image description here

使用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)
    }
}

还有其他解决方法吗?

2 个答案:

答案 0 :(得分:2)

使用各种notifyItemFoo()方法(例如,移动/插入/删除)不会重新绑定视图。这是设计使然。你可以打电话

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

以重新绑定移动的视图。

答案 1 :(得分:0)

notifyItemMoved将不会更新它。根据文档:

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

这是结构性变化事件。数据集中其他现有项目的表示形式仍被认为是最新的,并且不会反弹,尽管它们的位置可能会发生变化。

所见即所得。

可能希望使用notifyItemChanged进行研究,或者翻阅文档并查看最适合您的方法。