Java如何取消拖动排序?

我搞了个RecyclerView,里面有很多item,我对想其进行拖动排序。现在已经能实现拖动排序了,用ItemTouchHelper实现的。现在的问题是:排完序之后,如何取消拖动排序?我尝试过关闭长按,控件.setLongClickable(false)——但它跟本不吃这一套。长按监听一直不能取消。有人说,在设置.setLongClickable(false)之前,要在前面加.setOnLongClickListener。我试了,依然不起用。我于是又想在ItemTouchHelper.Callback里动手脚,让他返回null。但万恶的代码编译软件,直接让软件闪退!没办法,写了一句:recreate();或者是:Intent intent = new Intent(this, MainActivity.class); startActivity(intent);——让一切回到起点。一是不知道这两个方法哪个好,二是觉得这屏幕总是闪,也不是个办法,还有没有其它更好的办法呢?

参考GPT和自己的思路:

对于您的问题,我可以给出几个解决方案:

  1. 在排完序后,调用ItemTouchHelper的onItemDragStateChanged方法,将dragging状态改为false,这样就可以取消拖动排序了。

  2. 在ItemTouchHelper.Callback的onSelectedChanged方法中,当state为ItemTouchHelper.ACTION_STATE_IDLE时,将长按监听取消,代码如下:

override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
     super.onSelectedChanged(viewHolder, actionState)
     if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {
         viewHolder?.itemView?.setOnLongClickListener(null)
     }
}
  1. 使用一个flag来记录是否处于拖动排序状态,并在需要取消排序时将flag设为false,然后在长按监听中判断flag状态是否为true,代码如下:
private var isSorting = false

override fun onTouch(view: View, event: MotionEvent): Boolean {
   when (event.action) {
       MotionEvent.ACTION_DOWN -> {
           if (!isSorting) {
               // 进行排序相关操作
           }
   }
   return true
}

fun cancelDragging() {
   isSorting = false
}

以上几个解决方案可以根据您的实际情况来选择适合的方法。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^