5

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

我在 QuickPanel 的自定义 ROM 中看到了这个(我几乎可以肯定我在 Cyanogenmod 中看到过)。这是一个屏幕截图,可以帮助您理解这个想法:

截图

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

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

在此先感谢您提供有关此问题的任何提示。

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

  • 使用一个自定义的Adapter(我这里是ArrayAdapter),来实现这个item可拖动的视觉反馈,就是TextView附近的一个ImageView。这是可选的。

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

  • 有一行将 View 投射到 ViewGroup,它出现了一些错误,所以我删除了投射没有任何问题,不需要它。(在 onInterceptTouchEvent 方法中)。

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

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

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

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

4

1 回答 1

5

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

TouchInterceptor.java

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

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

您可以轻松地扩展或修改 TouchInterceptor 类以添加额外的功能,因为低级的东西都为您准备好了。

于 2012-06-20T16:36:39.710 回答