Android RecyclerView notifyItemMoved()未更新位置
为什么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
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()