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

时间:2012-06-20 16:19:26

标签: android listview

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

我在自定义ROM中看到了这一点(我几乎可以肯定我在Cyanogenmod中看到了它)用于QuickPanel。这是一个通过屏幕截图的截图:

Screenshot of the "widget Button Order" in QuickPanel Settings of Sabotage ROM

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

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

提前感谢任何关于此的提示。

更新:我最终使用了已接受答案中的文件,添加和修改。我将它们列在此处以供进一步参考。

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

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

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

  • 在TouchInterceptor的构造函数中更改mRemoveMode = 1;,或者FLING = 0; SLIDE = 1; TRASH = 2;之一。我认为对于TRASH,资源也应该可用。

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

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

我希望它可以帮助其他人:)

1 个答案:

答案 0 :(得分:5)

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

TouchInterceptor.java

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

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

您可以轻松扩展或修改TouchInterceptor类以添加其他功能,因为您可以使用低级别的内容。