DragSortListView:可拖动排序的listview

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只有一个回调函数

public void drop(int from, int to);

当floating View被释放的时候,被调用,from表示这次拖动是从listview的哪个子view开始的,to表示拖动到哪里,下面是一个使用DropListener的例子:

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方法:

public void remove(int which);

参数which表示被删除的是listview的哪个item。

DragSortListView.DragListener

DragListener的回调函数为:

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