如何使用可拖动项目制作ListView?

jad*_*k94 5 android listview

我正在寻找一个ListPreference,用户可以在其中更改列表中的项目顺序.这些物品可以拖动,并且可以由用户重新订购.

我在我的自定义ROM中看到了这个(我几乎可以肯定我在Cyanogenmod中看到它)用于QuickPanel.这是一个截图,通过以下方式获得创意:

Sabotage ROM的QuickPanel设置中的

我知道如何制作自定义ListView项目并设置图标以指示项目是可拖动的,但我不知道如何使它们可拖动,并相应地更改顺序.至于在偏好中保存它们,我发现可以很容易地实现.

PS:我知道Cyanogenmod是开源的,但我找不到这个特殊事物的来源:(我能得到的最接近的是这个,它应该在另一个屏幕附近...

在此先感谢任何关于此的提示.

更新:我最终使用了接受的答案中的文件,添加和修改.我在这里列出它们以供进一步参考.

  • 使用自定义适配器(在我的情况下为ArrayAdapter)来实现此项可拖动的视觉反馈,这是TextView附近的ImageView.这是可选的.

  • 设置DragListener和RemoveListener以相应地更新列表.ListView不会自动执行此操作.这取决于您使用的适配器.

  • 有一行将View转换为ViewGroup,它产生了一些错误,所以我删除了没有任何问题的转换,不需要它.(在onInterceptTouchEvent方法中).

  • 改变mRemoveMode = 1;TouchInterceptor的构造函数,或者:FLING = 0; SLIDE = 1; TRASH = 2;.我认为TRASH,资源也应该可用.

我实际上不是从答案的链接中获取文件,而是从我已经拥有的Cyanogenmod中获取文件,但我猜这些文件是相同的.

这些是项目中的实际文件(在撰写本文时的r12):

我希望它可以帮助别人:)

Vic*_*tor 5

没有内置的小部件可以执行此操作,但您可能需要查看AOSP音乐播放器使用的自定义实现,以允许重新排序播放列表中的歌曲.

TouchInterceptor.java

这是扩展ListView的类,负责处理所有MotionEvent并重新排序其项目,以及检测用于删除项目的滑动.您可以在TrackBrowserActivity.java类中看到它已实现到此处的活动中.

它有三个你应该知道的接口:DragListener,DropListener和RemoveListener.您可以使用这些接口为它们提供回调以触发这些事件,以便您可以将对列表顺序所做的更改更新为SavedPreferences(因为ListView不会为您处理).

您可以轻松地扩展或修改TouchInterceptor类以添加其他功能,因为您可以使用低级别的东西.