Android 光标适配器和列表适配器的拖放排序

Android 光标适配器和列表适配器的拖放排序,android,listview,drag-and-drop,android-cursoradapter,Android,Listview,Drag And Drop,Android Cursoradapter,我很惊讶有这么少关于使用游标适配器和列表适配器进行拖放排序的信息 我在stackoverflow上找到的最近的帖子是: 但是,我不清楚如何实现Commonware所建议的功能-澄清将非常有帮助 到目前为止,我将光标数据绑定到列表适配器,并按如下方式进行设置: mMyCursorAdapter = new MyCursorAdapter(getActivity(), null); setListAdapter(mMyCursorAdapter); getLoaderManager().initL

我很惊讶有这么少关于使用游标适配器和列表适配器进行拖放排序的信息

我在stackoverflow上找到的最近的帖子是:

但是,我不清楚如何实现Commonware所建议的功能-澄清将非常有帮助

到目前为止,我将光标数据绑定到列表适配器,并按如下方式进行设置:

mMyCursorAdapter = new MyCursorAdapter(getActivity(), null);
setListAdapter(mMyCursorAdapter);
getLoaderManager().initLoader(0, null, this);
列表已生成,但我现在希望向列表项添加拖放功能


我想从体系结构的角度了解实现这一点的最佳方法,关于如何开发核心功能的任何建议也都会很有用。

这是完全可以实现的,幸运的是大部分工作已经完成,但是您需要稍微修改一个类以满足您的规范

默认的Android音乐应用程序具有您需要的所有类

首先,您需要获取允许拖放的自定义
ListView

您还需要抓取它们的自定义
光标
,该光标用于实际移动
列表视图中的项目
。它是一个名为
NowPlayingCursor
的内部类

NowPlayingCursor
扩展了
AbstractCursor
并使用它返回队列。方法
makeNowPlayingCursor()
指定了编写大部分自己代码的位置。您需要返回感兴趣移动的项目,而不是返回队列,不管它们是什么

为了使用
TouchInterceptor
,您需要实现
TouchInterceptor.DropListener

   private TouchInterceptor.DropListener mDropListener =
        new TouchInterceptor.DropListener() {
        public void drop(int from, int to) {
               final NowPlayingCursor mNowPlayingCursor = (NowPlayingCursor) YOUR_CURSOR;
                mNowPlayingCursor.moveItem(from, to);
                // Call `notifyDataSetChanged` here.
        }
    };
您还应该查看他们用于将项目从一个索引移动到另一个索引的
moveQueueItem
方法。调用
onMove
moveItem
时,此方法用于
NowPlayingCursor


所以,你有一些工作要做,但这绝对是可能的

这是一个有望解决您的问题的库,它支持对列表项进行拖放重新排序。 有一个优秀的演示,包括
片段
游标

主要特点:

  • 干净的拖放(我希望没有视觉故障!)
  • 拖动时直观平滑地滚动。
  • 支持异构项目高度。
  • 公共startDrag()和stopDrag()方法。
  • 用于自定义浮动视图的公共界面。
杰森·麦克雷诺兹(包括a)给了我很大的帮助


它解释了如何使用Carl A.Bauer的库以及游标适配器和SqLite。它还显示了如何在数据库中保存ListView的新排序状态

Android中没有对
ListView
的拖放支持。我有一个用于此的库,在我无法合理地维护它之后,我停止了它,并且它无论如何都不能与
游标适配器一起工作。您可以在Internet上找到其他拖放
ListView
实现,尽管我怀疑其中任何一个都不能与
CursorAdapter
@Commonware一起使用。您能否共享该库以便我们在项目中使用它?Thanks@CommonsWare谢谢你的回复。我在搜索光标拖放/排序方面不是很成功,但我发现了许多listview实现。我仍然想实现你在上面帖子中的建议。你还会认为这是一个好的方法吗?如果你这样做,你能详细阐述一下吗?“@安卓迪亚疯狂”你会认为这是一个很好的方法,如果是这样的话,你能详细阐述一下吗?”——不是真的。我从未实施过这一点。我在那个答案中写的是一个简单的解决方案(实际上是两个解决方案IIRC)。装饰器模式是一种标准的软件设计模式。也许你可以考虑用一些你不理解的东西来更新你的问题,也许有人能回答这些特定的事情。谢谢你的链接。