【问题标题】:Drag and drop sorting of cursor adapter and list adapter光标适配器和列表适配器的拖放排序
【发布时间】:2012-07-23 21:22:26
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • Android 中没有对ListView 的拖放支持。我有一个用于此的库,在我无法再合理地维护它之后我停止了它,并且无论如何它都不适用于CursorAdapter。您可以在 Internet 上找到其他拖放式 ListView 实现,但我怀疑其中任何一个都可以与 CursorAdapter 一起使用。
  • @CommonsWare 你能分享这个库,以便我们可以在我们的项目中使用它吗?谢谢
  • @CommonsWare 感谢您的回复。我在搜索光标拖放/排序方面并不是很成功,但我发现了许多列表视图实现。我仍然想实施您在上面的帖子中提出的建议。您是否仍然认为这是一个好方法,如果是的话,您能否详细说明一下:)?
  • “您是否仍然认为这是一个好方法,如果是的话,您能否详细说明一下:)” - 不是真的。我从来没有实现过这个。我在那个答案中写的是一个粗略的解决方案(实际上是两个解决方案 IIRC)。装饰器模式是标准的 SW 设计模式。也许您可以考虑用您不理解的具体内容更新您的问题,也许有人可以回答这些具体内容。

标签: android listview drag-and-drop android-cursoradapter


【解决方案1】:

Jason McReynolds 的This blog post(包括sample project)对我帮助很大。

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

【讨论】:

    【解决方案2】:

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

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

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

    That can be found here - TouchInterceptor.java.

    您还需要获取他们自定义的Cursor,该Cursor 用于实际移动ListView 中的项目。这是一个名为NowPlayingCursor 的内部类。

    That can be found here - 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 方法。当onMovemoveItem 被调用时,此方法在NowPlayingCursor 中使用。

    That can be found here - MediaPlaybackService.java

    因此,您需要完成一些工作,但这绝对是可能的。

    【讨论】:

      【解决方案3】:

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

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

      主要特点:

      • 干净的拖放(没有视觉故障;我希望!)。
      • 拖动时直观流畅的滚动。
      • 支持异构项目高度。
      • 公共 startDrag() 和 stopDrag() 方法。
      • 用于自定义浮动视图的公共界面。

      【讨论】:

      • 看起来很有希望我很快就会尝试看看这个。谢谢你的链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多