提问者:小点点

Android:带有 ItemTouchHelper.回调在列表中较低项目闪烁的回收视图


我目前正在尝试通过拖放重新排序实现回收器视图列表。为此,我使用 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 并禁用了动画,但这无济于事。有没有人知道这可能是什么原因以及如何解决?


共2个答案

匿名用户

试试这个

recyclerView.getItemAnimator().setChangeDuration(0);

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

匿名用户

试试这个:

适配器初始化后:

adapter.setHasStableIds(true);

在适配器类中:

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