由于ListView在Dialog里面,所有用WindowManager的方式不合适,又从网上参考了一些资料后实现:
主要参考大神:https://github.com/1993hzw/Androids/blob/master/README_DragListView.md
ListView 中的item长按后拖拽:
需要重写ListView,在DispatchTouchEvent中拦截事件,在ACTION_DOWN事件中判断按下的位置是否在想要的item的位置上,可以使用View.getHitRect()方法来判断,如果在的话使用handler延迟发送一个小时达到长按的效果,在延迟期间会有MOVE事件,所以在Move事件中要 做判断,判断手指按下的位置是否还在需要长按的item(后面简称item)上,如果不在就移除handler中的消息,除非延迟的消息已处理,并且手指在item上,才会调用startDrag;在handler处理中,获取对应条目的bitmap:
mItemView.setDrawingCacheEnabled(true); mBitmap = Bitmap.createBitmap(mItemView.getDrawingCache()); mItemView.setDrawingCacheEnabled(false);
在移动过程中需要实时刷新,需要重写dispatchDraw,绘制item,移动位置实时交换数据位置
RecyclerView 中item长按拖拽:
需要重写ItemTouchHelper类
如果整个条目的长按
isLongPressDragEnabled return true;
如果是单个item长按,需要返回false;然后设定单个item的长按事件
demo:https://github.com/xiangyouxinsheng1314/MyDemo