白云LDC 2023-03-23 20:06 采纳率: 43.8%
浏览 25

Java如何取消拖动排序?

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

  • 写回答

2条回答 默认 最新

  • IT_service_mesh 2023-03-23 20:19
    关注

    参考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
    }
    

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

    评论

报告相同问题?

问题事件

  • 创建了问题 3月23日