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