我正在寻找一个 ListPreference,用户可以在其中更改列表中项目的顺序。这些项目将是可拖动的,并且可以由用户重新排序。
我在我的 QuickPanel 自定义 ROM 中看到了这个(我几乎可以肯定我在 Cyanogenmod 中看到了它)。这是一个屏幕截图,用于说明这个想法:
我知道如何制作自定义 ListView 项目并设置图标以指示项目可拖动,但我不知道如何使它们可拖动并相应地更改顺序。至于将它们保存在首选项中,我发现可以轻松实现的 this。
PS:我知道 Cyanogenmod 是开源的,但我找不到这个特定东西的来源 :( 我能找到的最接近的是 this ,它应该在另一个屏幕附近的某个地方...
提前感谢有关此的任何提示。
更新:我最终使用了已接受答案中的文件,并进行了添加和修改。我在这里列出它们以供进一步引用。
使用自定义适配器(在我的示例中为 ArrayAdapter),实现此项目可拖动的视觉反馈,它是 TextView 附近的 ImageView。这是可选的。
设置 DragListener 和 RemoveListener 以相应地更新列表。 ListView 不会自动执行此操作。这取决于您使用的适配器。
有一行将 View 转换到 ViewGroup,它产生了一些错误,所以我毫无问题地删除了转换,不需要它。 (在 onInterceptTouchEvent 方法中)。
在 TouchInterceptor 的构造函数中更改
mRemoveMode = 1;
,或以下之一:FLING = 0;幻灯片 = 1;垃圾 = 2;
。我认为对于TRASH
,资源也应该可用。
我实际上不是从答案的链接中获取文件,而是从我已经拥有的 Cyanogenmod 中获取文件,但我猜这些文件是相同的。
这些是项目中的实际文件(在撰写本文时位于 r12):
- The Preference using this ListView
- The ListActivity with the listeners and the Adapter
- The actual ListView
我希望它对其他人有帮助:)
最佳答案
没有内置小部件可以执行此操作,但您可能想看看 AOSP 音乐播放器使用的自定义实现,以允许对播放列表中的歌曲重新排序。
这是扩展 ListView 的类,负责处理所有 MotionEvent 并重新排序其项目,以及检测用于删除项目的滑动。您可以在 TrackBrowserActivity.java 中看到它已实现到 Activity 中类(class)。
您还应该了解它的三个接口(interface):DragListener、DropListener 和 RemoveListener。您可以使用这些接口(interface)为其提供回调以触发这些事件,以便您可以将对列表顺序所做的更改更新到您的 SavedPreferences(因为 ListView 不会为您处理)。
您可以轻松地扩展或修改 TouchInterceptor 类以添加额外的功能,因为底层的东西都已为您准备好了。
关于android - 如何制作带有可拖动项目的 ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123824/