为什么notifyItemMoved不重新绑定(我的意思是onBindViewHolder
没有调用)我回收视图的适配器?在顶部或底部移动项目后,我会在单击时得到旧位置
如何通过点击获得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)
}
发布于 2018-07-09 08:18:46
当项移动但没有更改时,应该调用notifyItemMoved()
:
这是一个结构性变化事件。数据集中其他现有项目的表示仍然被认为是最新的,不会反弹,尽管它们的位置可能会被更改为。
这意味着给予onBindViewHolder()
的位置可能会发生变化。您可以使用ViewHolder.getAdapterPosition()
获得当前位置。
发布于 2019-03-20 22:28:14
尝试在notifyItemChanged(position, payload)
之后使用notifyItemMoved。它不停地漏水!
或
使用holder.adapterPosition
!
发布于 2021-04-01 06:15:13
为了更新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
}
它不是正确的解决方案,在错误的项目动画中可能有副作用。
https://stackoverflow.com/questions/51249698
复制相似问题