【问题标题】:How to make a ListView with draggable items?如何制作带有可拖动项目的 ListView?
【发布时间】:2012-06-20 16:19:26
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 这个没有标准函数,所以你必须重写 onTouch 并检测触摸事件。您的覆盖可能会被 longClick 事件激活,否则您不知道用户是要拖动项目还是滚动列表。
  • @Christine 我不能用OnDragListener吗?
  • @jadkik94 嗨。我正在尝试使用这些文件来实现同样的事情。但由于这是一个相当古老的问题,我想知道是否有更好的或者我会说更方便的方法来实现可拖动列表是否已经出现?我找不到任何东西。将不胜感激您可以提供的任何指示.. 谢谢。

标签: android listview


【解决方案1】:

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

TouchInterceptor.java

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

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

您可以轻松扩展或修改 TouchInterceptor 类以添加额外的功能,因为低级的东西都在那里。

【讨论】:

  • 对,我知道我在其他地方看到过,为什么我没有想到这一点?奇怪的是他们不使用像in the docs 这样的拖放事件。无论如何,我永远不可能独自完成这件事。谢谢,我会尝试并回复您。
  • Drag and Drop API 是在 API 级别 11 中添加的,并且此实现针对 API 级别 8,因此它可能是在该 API 完成或广泛可用之前编写的。
  • 可能就是这样。我刚刚注意到一件事,你确定 MusicPicker.java 中使用了 TouchInterceptor 类吗?该类未在此处导入/使用。
  • TouchInterceptor.java的历史,我觉得是用在TrackBrowser.java
  • 哎呀,你是对的。在 MusicPicker 中没有使用它,它实际上在 MediaPickerActivity 中使用。您可以看到 XML 布局文件 MediaPickerActivity 正在加载 here。但是,您仍然看不到任何导入,因为它只是将其视为常规 ListView。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-31
相关资源
最近更新 更多