Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView notifyItemMoved()未更新位置_Android_Android Recyclerview - Fatal编程技术网

Android RecyclerView notifyItemMoved()未更新位置

Android RecyclerView notifyItemMoved()未更新位置,android,android-recyclerview,Android,Android Recyclerview,为什么notifyItemMoved不重新绑定(我的意思是onBindViewHolder不调用)我的recyclerView的适配器?在顶部或底部移动项目后,我在单击时得到旧位置 如何通过单击itemView来获取其当前位置 我的移动方式的回收 fun moveUp(position: Int){ if(position>0){ itemList.swap(position, position-1) notifyItemMoved(posi

为什么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)

    }
应在项目已移动但未更改时调用:

这是一个结构性变化事件。其他现有文件的陈述 数据集中的项目仍然被认为是最新的,将不会被删除 反弹,尽管他们的位置可能会改变

这意味着
onBindViewHolder()
的位置可能会发生变化。 您可以使用获取当前位置。

应在项目已移动但未更改时调用:

这是一个结构性变化事件。其他现有文件的陈述 数据集中的项目仍然被认为是最新的,将不会被删除 反弹,尽管他们的位置可能会改变

这意味着
onBindViewHolder()
的位置可能会发生变化。
您可以使用获取当前位置。

尝试在notifyItemMoved之后使用
notifyItemChanged(位置,有效负载)
。 它不停地拖


使用支架。适配器位置

尝试在notifyItemMoved之后使用
notifyItemChanged(位置、负载)
。 它不停地拖


使用支架。适配器位置

要更新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
            }
在移动中覆盖乐趣(
p0:RecyclerView,
p1:RecyclerView.ViewHolder,
p2:RecyclerView.ViewHolder
):布尔值{
val sourcePosition=p1.adapterPosition
val targetPosition=p2.adapterPosition
Collections.swap(savedUris、sourcePosition、targetPosition)
adapter.notifyItemMoved(sourcePosition,targetPosition)
//更新您的列表,我正在使用可变livedata
_list.postValue(savedUris)//使用新数据更新现有列表
//通知
if(源位置<目标位置){
adapter.NotifyItemRange已更改(
sourcePosition,
(目标位置-源位置)+1
)
}否则{
adapter.NotifyItemRange已更改(
目标位置,
(源位置-目标位置)+1
)
}
返回真值
}

这不是正确的解决方案,在错误的项目动画中可能会有副作用。为了更新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
            }
在移动中覆盖乐趣(
p0:RecyclerView,
p1:RecyclerView.ViewHolder,
p2:RecyclerView.ViewHolder
):布尔值{
val sourcePosition=p1.adapterPosition
val targetPosition=p2.adapterPosition
Collections.swap(savedUris、sourcePosition、targetPosition)
adapter.notifyItemMoved(sourcePosition,targetPosition)
//更新您的列表,我正在使用可变livedata
_list.postValue(savedUris)//使用新数据更新现有列表
//通知
if(源位置<目标位置){
adapter.NotifyItemRange已更改(
sourcePosition,
(目标位置-源位置)+1
)
}否则{
adapter.NotifyItemRange已更改(
目标位置,
(源位置-目标位置)+1
)
}
返回真值
}

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

您是否尝试了notifyDatasetChange或notifyItemChange?这不是正确的解决方案,但你会明白问题是否出在位置或其他方面。@GiulioPettenuzzo notifyDatasetChange工作得很好,但我在这种情况下会丢失动画,所以如果动画完成后调用notifyDatasetChange会怎么样?这种奇怪的“绑定”方法是什么?将适配器
发布到BindViewHolder
上。是否尝试使用notifyDatasetChange或notifyItemChange?这不是正确的解决方案,但你会明白问题是否出在位置或其他方面。@GiulioPettenuzzo notifyDatasetChange工作得很好,但我在这种情况下会丢失动画,所以如果动画完成后调用notifyDatasetChange会怎么样?这种奇怪的“绑定”方法是什么?在BindViewHolder上发布您的适配器。如果我在我的bind中使用它,我会遇到同样的问题,这意味着,我使用这个方法对我来说毫无用处,那么什么是正确的绑定方法呢?单击侦听器应该有一个对
ViewHolder
的引用,以便能够调用
getAdapterPosition()
在单击时间如果我在我的
绑定中使用它
我会遇到同样的问题,这意味着我认为这个方法对我来说毫无用处,那么绑定的正确方法是什么呢?单击侦听器应该有一个对
视图持有者的引用
,以便能够在单击时间调用
getAdapterPosition()