我搞了个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和自己的思路:
对于您的问题,我可以给出几个解决方案:
在排完序后,调用ItemTouchHelper的onItemDragStateChanged方法,将dragging状态改为false,这样就可以取消拖动排序了。
在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) } }- 使用一个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 }以上几个解决方案可以根据您的实际情况来选择适合的方法。
解决 无用评论 打赏 举报