我目前正在尝试通过拖放重新排序实现回收器视图列表。为此,我使用 ItemTouchHelper.SimpleCallback
class SoftkeyScreenListReorderHelperCallback(
private val adapter: SoftkeyScreenListAdapter
) : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END, 0) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return adapter.itemMoved(viewHolder.bindingAdapterPosition, target.bindingAdapterPosition)
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
}
我的适配器获得了itemMoved()方法,该方法在回调的onMove()方法中调用。在这里,我只是交换项目并通知适配器有关更改的信息。
fun itemMoved(fromPosition: Int, toPosition: Int): Boolean {
Collections.swap(list, fromPosition, toPosition)
notifyItemMoved(fromPosition, toPosition)
return true
}
对于我的回收器视图,我实现了以下内容
binding.recyclerview.apply {
[...] // adapter init
myAdapter.setHasStableIds(true)
adapter = myAdapter
val touchHelper = ItemTouchHelper(SoftkeyScreenListReorderHelperCallback(adapter as SoftkeyScreenListAdapter))
touchHelper?.attachToRecyclerView(this)
(itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
setHasFixedSize(true)
}
它有效,但我总是为新项目位置下方(之后)的项目闪烁。假设我有 5 个项目 {1,2,3,4,5} 并且想用 3 交换 1,然后 4 和 5 正在闪烁。1、2 和 3 没有。
我已经将回收器视图大小设置为固定,启用了稳定 ID 并禁用了动画,但这无济于事。有没有人知道这可能是什么原因以及如何解决?
试试这个
recyclerView.getItemAnimator().setChangeDuration(0);
您可能正在从一个地方获取或加载数据,或者使用需要一些时间的库。如果是这样的话,这个答案可能会有所帮助
试试这个:
适配器初始化后:
adapter.setHasStableIds(true);
在适配器类中:
@Override
public long getItemId(int position) {
return itemList.get(position).hashCode();
}