我正在寻找一个ListPreference,用户可以在其中更改列表中的项目顺序。这些物品可以拖动,并且可以由用户重新订购。
我在自定义ROM中看到了这一点(我几乎可以肯定我在Cyanogenmod中看到了它)用于QuickPanel。这是一个通过屏幕截图的截图:
我知道如何制作自定义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):
我希望它可以帮助其他人:)
答案 0 :(得分:5)
没有内置的小部件可以执行此操作,但您可能需要查看AOSP音乐播放器使用的自定义实现,以便重新排序播放列表中的歌曲。
这是扩展ListView的类,负责处理所有MotionEvent并重新排序其项目,以及检测用于删除项目的滑动。您可以在TrackBrowserActivity.java课程中看到它已实施到此处的活动中。
它还有三个你应该知道的接口:DragListener,DropListener和RemoveListener。您可以使用这些接口为它们提供回调以触发这些事件,以便您可以将对列表顺序所做的更改更新为SavedPreferences(因为ListView将不会为您处理)。
您可以轻松扩展或修改TouchInterceptor类以添加其他功能,因为您可以使用低级别的内容。