RecyclerView notifyItemMoved()不更新位置

时间:2018-07-09 16:02:08

标签: android android-recyclerview

为什么notifyItemMoved不重新绑定(我的意思是onBindViewHolder不调用)我的recyclerView适配器?在顶部或底部移动项目后,我的点击位置变老了

如何通过单击来获取我的itemView的当前位置?

我回收者的移动方法

    fun moveUp(position: Int){
    if(position>0){
        itemList.swap(position, position-1)
        notifyItemMoved(position, position-1)
    }
}
fun moveDown(position: Int){
    if(itemList.lastIndex>position){
        itemList.swap(position, position + 1)
        notifyItemMoved(position, position + 1 )

    }
}

我的绑定方法

    override fun View.bind(item: Document, position: Int) {
    document_name.text = getFileName(item.file)
    this.setOnClickListener{
        onItemClick(this, position)

    }

4 个答案:

答案 0 :(得分:5)

notifyItemMoved()应该在物品移动了 但没有改变 时被调用:

  

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

这意味着赋予focus的位置可能会发生变化。 您可以使用ViewHolder.getAdapterPosition()来获取当前位置。

答案 1 :(得分:0)

在notifyItemMoved之后尝试使用notifyItemChanged(position)

答案 2 :(得分:0)

在notifyItemMoved之后尝试使用notifyItemChanged(position, payload)。 它不会停止拖动!

使用holder.adapterPosition

答案 3 :(得分:0)

为了更新 viewholder 的位置,您必须通知适配器哪些项目发生了更改,您可以使用适配器中可用的 notifyItemRangeChanged(startPosition,itemCount) 方法。

      override fun onMove(
                p0: RecyclerView,
                p1: RecyclerView.ViewHolder,
                p2: RecyclerView.ViewHolder
            ): Boolean {
                val sourcePosition = p1.adapterPosition
                val targetPosition = p2.adapterPosition
                Collections.swap(savedUris, sourcePosition, targetPosition)
                adapter.notifyItemMoved(sourcePosition, targetPosition)
              
               //update your list ,i am using mutable livedata
               _list.postValue(savedUris) //updating existing list with new data

              // Notifying
                if (sourcePosition < targetPosition) {
                    adapter.notifyItemRangeChanged(
                        sourcePosition,
                        (targetPosition - sourcePosition) + 1
                    )
                } else {
                    adapter.notifyItemRangeChanged(
                        targetPosition,
                        (sourcePosition - targetPosition) + 1
                    )
                }
                return true
            }

这不是正确的解决方案,错误的项目动画可能会有副作用