Android:使用ItemTouchHelper进行Recyclerview.列表中较低项目的回调闪烁



我目前正在尝试实现一个带有拖放重新排序的RecyclerView列表。为此,我使用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) {}
}

My Adapter获得了itemMoved((方法,该方法在回调中的onMove((方法中调用。在这里,我只是交换项目,并将更改通知适配器。

fun itemMoved(fromPosition: Int, toPosition: Int): Boolean {
Collections.swap(list, fromPosition, toPosition)
notifyItemMoved(fromPosition, toPosition)
return true
}

对于我的RecyclerView,我实现了以下

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没有。

我已经将recyclerview的大小设置为固定,启用了稳定的id并禁用了动画,但这并没有帮助。有人知道这可能是什么原因以及如何解决吗?

尝试这个

recyclerView.getItemAnimator().setChangeDuration(0);

可能,您正在从某个地方获取或加载数据,或者使用需要一些时间的库。如果是这样的话,这个答案可以帮助

试试这个:

适配器初始化后:

adapter.setHasStableIds(true);

在适配器类中:

@Override
public long getItemId(int position) {
return itemList.get(position).hashCode();
}

最新更新