21

我很惊讶使用光标适配器和列表适配器进行拖放排序的信息如此之少。

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

https://stackoverflow.com/a/5047618/317889

但是,我不清楚如何实施 CommonsWare 的建议 - 澄清会非常有帮助。

到目前为止,我将游标数据绑定到列表适配器并将其设置如下:

mMyCursorAdapter = new MyCursorAdapter(getActivity(), null);
setListAdapter(mMyCursorAdapter);
getLoaderManager().initLoader(0, null, this);

列表已生成,但我现在希望向列表项添加拖放功能。

我想知道从架构的角度来解决这个问题的最佳方法,以及任何关于如何进行核心功能开发的指针也将是有用的。

4

3 回答 3

3

Jason McReynolds 的这篇博文(包括一个示例项目)对我帮助很大。

它解释了如何将 Carl A. Bauer 的 Library Drag-Sort-ListView与 CursorAdapter 和 SqLite 一起使用。它还展示了如何将 ListView 的新排序状态保存在数据库中。

于 2013-06-12T22:41:54.413 回答
1

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

默认的 Android 音乐应用程序包含您需要的所有课程。

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

可以在这里找到 - TouchInterceptor.java

您还需要获取他们Cursor用于实际移动ListView. 这是一个内部类,称为NowPlayingCursor.

可以在这里找到 - TrackBrowserActivity.java

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用于将项目从一个索引移动到另一个索引的方法。该方法用于NowPlayingCursorwhenonMovemoveItem被调用。

可以在这里找到 - MediaPlaybackService.java

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

于 2012-10-04T10:41:19.207 回答
0

这是一个希望能解决您的问题的库,它可以对列表项进行拖放重新排序。有一个出色的演示,其中包括FragmentsCursors

https://github.com/bauerca/drag-sort-listview

主要特征:

  • 干净的拖放(没有视觉故障;我希望!)。
  • 拖动时直观流畅的滚动。
  • 支持异构项目高度。
  • 公共 startDrag() 和 stopDrag() 方法。
  • 自定义浮动视图的公共接口。
于 2012-11-22T06:02:00.897 回答