摘要 DragSortListView是一個可以實現拖動排序的listview控件,是我看到的交互較爲複雜的開源代碼中不管是代碼質量還是流暢性都最好的。雖然作者已經不再更新其版本,但是仍然非常值得我們去研究,尤其是那些本身需要這種效果的朋友。 DragSortListView 簡稱DSLV
DragSortListView是一個可以實現拖動排序的listview控件,是我看到的交互較爲複雜的開源代碼中不管是代碼質量還是流暢性都最好的。雖然作者已經不再更新其版本,但是仍然非常值得我們去研究,尤其是那些本身需要這種效果的朋友。
DragSortListView 簡稱DSLV,繼承自listView,能實現拖動排序、滑動刪除,主要用於這樣的listview,音樂列表、收藏列表、清單列表等。他的主要特點如下:
1.乾淨利落的拖動效果,不會對界面的已有元素造成視覺上的干擾。
2.即使是在拖動的過程中,如果到了listview的上限邊界,仍然能很流暢的滾動listview。
3.允許listview的每個子view高度不一致。
4.提供了startDrag()和stopDrag()公共方法,也就是你可以在任意地方控制拖動。
5.提供了能自定義floating View的接口。
DragSortListView 中有三個重要的概念:
1.數據排序。拖動排序能夠重寫排列list中的數據順序,因爲DragSortListView 並不知道你的數據具體是如何組織的,排序的是由你自己實現DragSortListView 提供的一些監聽(Listener)接口來完成的。
2.拖動的開始於結束。startDrag()和stopDrag()分別實現開始與結束,但是一般拖動的效果都是藉助於DragSortController來完成的。
3.浮動視圖(floating view)。floating view的外觀和行爲是由實現了FloatViewManager 接口的類控制的。可以通過它將任何view展示出漂浮的效果。
DragSortListView可以直接定義在xml中,當然需要一些必要的屬性。
Listener
DragSortListView說白了還是一個listview,因此需要listadapter來形成其所有的子項。DSLV額外的在listadapter中對子view做了排序工作,這主要是通過一些listener的回調來實現的。爲DragSortListView註冊listener有如下兩種方式:
1.通過set*Listener的方式。
2.在自定義的ListAdapter中實現Listener的接口,當DragSortListView調用DragSortListView.setAdapter()的時候,DSLV
檢測到那些接口被實現然後調用合適的set*Listener()
DragSortListView.DropListener
DragSortListView.DropListener只有一個回調函數
1
|
public
void drop(int from, int to); |
當floating View被釋放的時候,被調用,from表示這次拖動是從listview的哪個子view開始的,to表示拖動到哪裏,下面是一個使用DropListener的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private
DragSortListView.DropListener onDrop = new
DragSortListView.DropListener() { @Override public
void drop(int from, int to) { if
(from != to) { DragSortListView
list = getListView(); String
item = adapter.getItem(from); adapter.remove(item); adapter.insert(item,
to); list.moveCheckState(from,
to); Log.d( "DSLV" ,
"Selected
item is "
+ list.getCheckedItemPosition()); } } }; |
DragSortListView.RemoveListener
DragSortListView的主要功能是提供拖動排序,但是與此同時,它也實現了滑動刪除的功能,當刪除一個item的時候removerListener將會調用它的remove方法:
1
|
public
void remove(int which); |
參數which
表示被刪除的是listview的哪個item。
DragSortListView.DragListener
DragListener的回調函數爲:
1
|
public
void drag(int from, int to); |
當拖動一個item到任何一個候選的目的位置(item)上方時DragListener都會調用其drag
()方法。這個listener主要是監聽拖動過程中經過了那些item,可以理解爲監聽拖動路徑。
DragSortListView.DragSortListener
這個listener的作用是綜合上述所有listener。
FloatViewManager
顧名思義FloatViewManager接口用於管理floatView,他處理floating View的創建,更新以及銷燬。通過DSLV的setFloatViewManager()傳遞給DSLV。
FloatViewManager的例子程序可以在參考SimpleFloatViewManager類。
github項目地址 https://github.com/bauerca/drag-sort-listview