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

 

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