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

时间:2012-07-25 12:35:03

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

对于使用游标适配器和列表适配器进行拖放排序的信息很少,我感到非常惊讶。

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

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

但是,我不清楚如何实现CommonsWare建议的内容 - 澄清会非常有用。

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

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

生成列表但我现在希望将拖放功能添加到列表项中。

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

3 个答案:

答案 0 :(得分:4)

Jason McReynolds的

This blog post(包括sample project)给了我很多帮助。

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

答案 1 :(得分:1)

这绝对可以实现并且幸运,因为大部分工作已经得到了解决,但您需要稍微修改一个类以满足您的规范。

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

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

<强> That can be found here - TouchInterceptor.java

您还需要获取用于实际移动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方法。调用NowPlayingCursoronMovemoveItem使用此方法。

<强> That can be found here - MediaPlaybackService.java

所以,你需要完成一些工作,但这绝对有可能。

答案 2 :(得分:0)

这是一个希望能够解决您的问题的库,它可以拖放列表项的重新排序。 有一个很好的演示,其中包含FragmentsCursors

的用例

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

主要特点:

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