標籤:android style http color os io 資料 2014
通過繼承ListView實現可拖拽的ListView,先說說實現拖拽的原理吧,實現拖拽需要考慮三個問題:第一怎麼確定你在拖拽listview裡面的item的時候就是你手指當前選中的item;第二實現拖拽的效果,就是有一個浮動的層跟隨你的手指在移動;第三你放開手指時怎麼把你拖拽的這個item放到當前listView的位置(也就是說改變item的位置)。明白了這三個問題就比較好實現了。
裡面會涉及到一些比較重要的方法調用,首先是pointToPosition(int x, int y)這方方法Android 官方的解釋是” Maps a point to a position in the list”,我把它理解為通過x和y的位置來確定這個listView裡面這個item的位置。有了這個方法就解決了第一和第三個問題了。接下來我們可以通過WindowManager來解決第二個問題,然後通過pointToPosition方法就可以擷取你手指按下時的item,這個item其實就是你listview裡面的item了,這樣的就可以把這個item設定為是WindowManager的view,這樣的話拖動的層的效果就類比出來了,接下來是怎麼讓這個WindowManager跟隨你的手指在移動。這個時候會涉及到WindowManager裡面的updateViewLayout(view, layoutparams)來重新整理WindowManager的位置,這樣就實現了WindowManager會跟隨你的手指在移動。最後就剩下你放下手指的時候怎麼讓你拖拽的item插入到listview裡面,這個插入的動作其實包含了移除和插入這兩個動作。這個時候你可能會問在某個位置插入這個item需要”position”和”item”兩個參數,position我們可以通過pointToPosition方法來擷取,然後要插入的“item”其實是你adapter裡面資料。因為我們上面的一系列動作都是在listview裡面完成的,但是在我們重寫listview的時候是還沒有給listview設定adapter是吧,這個問題的我們通過在重寫listview的類中自訂一個介面,然後你在activity裡面初始化listview資料的時候實現這個介面。介面裡面只有一個方法,方法裡面的兩個參數一個是你開始拖拽的的item的位置,另一個是你拖拽移動之後之後的item的位置。下面我們看看效果吧: