为什么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)
}
答案 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
}
这不是正确的解决方案,错误的项目动画可能会有副作用