經過繼承ListView實現可拖拽的ListView,先說說實現拖拽的原理吧,實現拖拽須要考慮三個問題:第一怎麼肯定你在拖拽listview裏面的item的時候就是你手指當前選中的item;第二實現拖拽的效果,就是有一個浮動的層跟隨你的手指在移動;第三你放開手指時怎麼把你拖拽的這個item放到當前listView的位置(也就是說改變item的位置)。明白了這三個問題就比較好實現了。spa
裏面會涉及到一些比較重要的方法調用,首先是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的位置。下面咱們看看效果吧:繼承