ListView可拖拽item的原理

來源:互聯網
上載者:User

標籤: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的位置。下面我們看看效果吧:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.