Android_开源控件_DragSortListview

原创 2015年07月10日 15:46:00

DragSortListview

前几天公司要做一个拖动排序的效果,找到了这款开源控件。十分强大~
Github链接:https://github.com/bauerca/drag-sort-listview

简要

DragSortListview是一个支持拖拽排序和左右滑动删除功能的自定义ListView,重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果,被评为当前拖动排序的最完美的解决方案:
1. 完美的拖拽效果
2. 在拖动时提供更平滑的列表滚动效果
3. 提供start/stopDrag()方法
4. 公开接口,可以自定义拖动的View

如何使用

有三个主要的元素来定义拖拽的操作
1. 数据重排:拖拽排序重排ListView底层的数据顺序,由于DSLV不知道您是如何组织您的数据的,所以重新组织数据必须由您自己通过实现相关的接口来实现。
2. 开始/停止拖动:通过调用DSLV的 startDrag() 和 stopDrag() 函数来启动或者停止拖动操作。 DragSortController这个助手类,提供了所有常用的 开始/停止/删除 拖拽操作功能。
3. Floating View(拖动的View):通过实现 FloatViewManager 接口可以控制 拖动的View 的视觉效果和行为。这样您可以显示任何内容作为 拖动的View,并且可以在拖动过程中更新其位置和显示状态。 DragSortController 助手类已经实现了该接口并提供了一些易用的实现方式。
[注意]
第一条是必须自己实现的,第二条和第三条可以使用DSC助手类实现

XML属性

名称 意义
collapsed_height (dimension, 1px) 拖动其实位置占位符的高度。不能为0
drag_scroll_start (float, 0.3) 拖动时开始滚动ListView的区域(为DSLV 高度的分数值,在0到1之前)
max_drag_scroll_speed (float, 0.5) 默认线性加速的拖动时滚动的最大速度。单位:像素/毫秒。
float_alpha (float, 1.0) 拖动View的透明度。取值0到1 , 1代表不透明。
slide_shuffle_speed (float, 0.7) 拖动View下方的View挤走的动画速度。1代表没有动画
drop_animation_duration (int, 150) 拖动放下时候的动画时间(毫秒)。
remove_animation_duration (int, 150) 删除一个ListView的空白区域消失的动画时间。
track_drag_sort (bool, false) 调试的选项。
use_default_controller (bool, true) DSLV是否创建一个默认的DragSortController 对象,并且设置如下属性的值。如果该属性为false,则如下的属性忽略。
float_background_color (color, BLACK) 拖动View的背景色。默认情况下拖动View是当前拖动的Item的图像缓存。
drag_handle_id (id, 0) ListItem中的一个View的资源id(或者ListItem的根view)。这个id用来识别“拖动的手柄”,只有当点击该view的时候才会触发拖动操作。使用默认DragSortController并且支持拖动操作的时候需要设置该属性。
sort_enabled (bool, true) 是否启用拖动排序功能(如果您只需要左右滑动删除,则无需启用排序功能)
drag_start_mode (enum, “onDown”) 设置启动拖动的手势。
“onDown”:当用户按下拖动手柄的时候启动拖动操作。
“onDrag”: 当用户按下拖动手柄开始拖动的时候启动拖动操作。
“onLongPress”:在拖动手柄上长按时候启动拖动操作。
remove_enabled (bool, false) 是否启用拖动删除的功能。
remove_mode (enum, “flingRight”) 设置启用删除的手势。
“clickRemove”:点击click_remove_id对应的View来删除。
“flingRight”: 快速向右滑动。
“flingLeft”: 快速向左滑动。
“slideRight”:向左滑动的时候,Floating View会变得透明。然后释放,删除。
“slideLeft”: 同上,向右滑动。
click_remove_id (id, 0) 当 remove_mode=”clickRemove”并且remove_enabled=”true”时候指定的删除一个Item的View。DragSortController使用了该属性。

Listeners

DragSortListView 是个 ListView,因此需要一个 ListAdapter 来提供每个List Item。拖动排序是通过DSLV中的一些接口添加到ListAdapter的条目中的。可以有两种方式来设置DSLV 的各种接口:
通过set*Listener() 函数来设置
让自定义的 ListAdapter 实现这些接口,当调用 DragSortListView.setAdapter()函数时候,会检测实现的接口并设置 set*Listener()。

DragSortListView.DropListener

DropListener接口有一个回调函数:

public void drop(int from, int to);

该函数在拖动排序完成的时候调用;例如 拖动View被放下了。参数 from 是ListView开始拖动的位置,to 是被放下的位置。该接口非常重要,否则DSLV无法完成拖动操作。
在 DSLV 上适当操作后,该函数需要重新排序ListAdapter中的数据。
[注意]
如果 DSLV 对象的 android:choiceMode 不是 “none”,并且您的 ListAdapter 没有稳定的ID,您则必须在 drop(from, to)中调用 DragSortListView.moveCheckState(int from, int to)

DragSortListView.RemoveListener

RemoveListener接口的回调函数

public void remove(int which);

和 TI 做法一样,DSLV 提供了手势来删除拖动的View。 完成一个删除手势后,DSLV 调用RemoveListener 接口的函数.
在ListAdapter中位置为 which 的条目需要被删除。是否真的删除或者只是标记删除由您自己实现。
在拖动操作之外您也可以删除条目。在任何时候都可以调用 DragSortListView.removeItem(int position) .
[注意]
如果 DSLV 对象的 android:choiceMode 不是 “none”,并且您的 ListAdapter 没有稳定的ID,您则必须在 remove(which)中调用 DragSortListView.moveCheckState(int from, int to)。

DragSortListView.DragListener

DragListener 中的回调接口为

public void drag(int from , int to);

当拖动的View位于一个新条目上方的时候 会调用该函数。 to 是当前潜在的放下位置, from是前一个位置。 TI 实现中提供了这个接口,目前还没使用场景举例。

DragSortListView.DragSortListener

这只是一个继承了上面3个接口的便利接口。

FloatViewManager

该接口用来创建、更新和销毁拖动的View。通过函数 setFloatViewManager() 来设置。 SimpleFloatViewManager演示了其用法,该类是个简单的实现。用拖动List Item的快照实现一个拖动的View。
如果您需要实现不同的拖动View则可以提供自己的FloatViewManager。 在 onCreateFloatView() 函数中,确保返回的View有个固定的尺寸 (不要使用 MATCH_PARENT! 虽然对于宽度来说用 MATCH_PARENT 也是可以的). DSLV 会根据您拖动View上的ViewGroup.LayoutParams 参数来测量该View。如果没有LayoutParams参数则会使用 WRAP_CONTENT 和 MATCH_PARENT 来测量器高度和宽度。

Drag start/stop

在DragSortListView 0.3.0以后,拖动开始和停止完全取决于您。在DSLV中调用startDrag() 或者 stopDrag() 即可。需要注意的是,如果在调用startDrag() 函数的时候没有Touch事件,则拖动操作不会启动。在通常情况下您都无需关系开始拖动的操作,DragSortController 已经帮助你做好了。

DragSortController

DragSortController 类实现了一些常用的拖拽操作和删除List item的操作。该类实现了 View.OnTouchListener 接口来监听点击事件。同时也实现了FloatViewManager 接口。如果您在XML文件中没有使用默认的DragSortController,则您需要调用DSLV对象的 setFloatViewManager() 和 setOnTouchListener() 函数来设置一个DragSortController 。
DragSortController的默认行为认为List Item启用了拖动操作并且具有一个“拖动手柄”View,在DragSortController 中设置了“拖动手柄”View的资源id(如果 use_default_controller 是 true的话,拖动手柄的ID可以在XML文件中设置)。如果点击事件发生在一个List Item中的拖动手柄View上并且检测到了启动拖动操作的手势,则会启动一个拖动操作。

更多信息参考API http://bauerca.github.com/drag-sort-listview

本文非独立写作,前些天看到一篇较好地介绍,就整理了下拿来和大家分享下。

可拖拽listview基本使用技巧(DragSortListView)

有段时间没写博客了。(额。。。。。四年左右吧)。文笔有些生疏,我尽量把用法和关键点讲清楚。        可拖拽的listview,DragSortListView这是gitHub上的一个开源项目。链...
  • forrey
  • forrey
  • 2014年11月21日 19:04
  • 24629

Android自定义控件:DragSortListview

drag-sort-listview是一个支持拖拽排序和左右滑动删除功能的自定义ListView,重写了 TouchInterceptor (TI) 类来提供更加优美的拖拽动画效果。包含如下特性 ...
  • dsc114
  • dsc114
  • 2014年03月19日 16:30
  • 1426

自定义控件——可拖拽排序的ListView

前言最经研究了一下拖拽排序的ListView,跟酷狗里的播放列表排序一样,但因为要添加自己特有的功能,所以研究了好长时间。一开始接触的是GitHub的开源项目——DragSortListView,实现...
  • a10615
  • a10615
  • 2016年05月12日 01:44
  • 11502

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

拖动实现listview的item改变顺序(DragSortListView)

用开源库DragSortListView做了一个demo,是用于拖拽改变listview中的item顺序的。
  • hjqjl
  • hjqjl
  • 2015年10月27日 17:17
  • 1373

开源drag-sort-listview实现左右滑动删除和排序

listView左右滑动删除以及手动排序是一个
  • dsc114
  • dsc114
  • 2014年06月26日 10:55
  • 3263

Android开源--DragSortListview

項目地址:https://github.com/bauerca/drag-sort-listview 简介:DragSortListview是支持通过左右拖拉删除数据,上下拖拉排序的列表,缺点是当数...

DragSortListView拖动排序的ListView,同时支持ListView滑动item删除

项目地址:https://github.com/Trinea/AndroidCommon Demo地址:https://play.google.com/store/apps/details?id...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android_开源控件_DragSortListview
举报原因:
原因补充:

(最多只允许输入30个字)