android - 如何制作带有可拖动项目的 ListView?

标签 android listview

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

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

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;幻灯片 = 1;垃圾 = 2;。我认为对于 TRASH,资源也应该可用。

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

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

我希望它对其他人有帮助:)

最佳答案

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

TouchInterceptor.java

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

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

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

关于android - 如何制作带有可拖动项目的 ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123824/

相关文章:

android - setContentView(R.layout.Main); Main 无法解析或不是字段

android - 如何始终以编程方式设置默认选中的单选按钮android?

java - 如何从 C++ 调用非静态 java 方法?

android - 类扩展 ListActivity "whose id attribute is ' android.R.id.list'"

listview - 如何在调整页面大小后调整 UWP ListView 的大小以适应页面?

java - 如何更改 Sqlite 数据库中特定数据的 Listview 中的行颜色

Flutter Listview 可滚动行

java - admob 的 xml 呈现问题

c# - ListView 的数据模板中的单选按钮组

android - 如何将 POJO 转换为 Android 上可读的字符串以进行调试?