ListView和RecyclerView中item长按后拖拽

由于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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章