我很惊讶有这么少量的信息,使用光标适配器和列表适配器进行拖放排序。
我在stackoverflow上找到的最接近的帖子是这个:
https://stackoverflow.com/a/5047618/317889
但是,我不清楚如何实现CommonsWare的建议 - 澄清将非常有帮助。
到目前为止,我将光标数据绑定到列表适配器并按如下方式进行设置:
mMyCursorAdapter = new MyCursorAdapter(getActivity(), null);
setListAdapter(mMyCursorAdapter);
getLoaderManager().initLoader(0, null, this);
列表已生成,但我现在希望向列表项添加拖放功能。
我想知道从架构角度解决这个问题的最佳方法,任何关于如何开发核心功能的指示也将是有用的。
Jason McReynolds的这篇博文(包括一个示例项目(对我帮助很大。
它解释了如何使用Carl A. Bauer的Library Drag-Sort-ListView与CursorAdapter和SqLite。它还演示如何在数据库中保存 ListView 的新排序状态。
这绝对可以实现,幸运的是,大部分工作已经处理好了,但是您需要稍微修改一个类以满足您的规格。
默认的 Android 音乐应用包含您需要的所有课程。
首先,您需要获取允许拖放的自定义ListView
。
可以在这里找到 - TouchInterceptor.java。
您还需要获取他们的自定义Cursor
,用于实际移动ListView
中的项目。这是一个叫做NowPlayingCursor
的内部类。
可以在这里找到 - 跟踪浏览器活动.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
方法。调用 onMove
和 moveItem
时,NowPlayingCursor
中使用此方法。
可以在这里找到 - 媒体播放服务.java
所以,你有一些工作要做,但这绝对是可能的。
这是一个希望能解决您的问题的库,它支持列表项的拖放重新排序。有一个出色的演示,其中包括Fragments
和Cursors
的用例
https://github.com/bauerca/drag-sort-listview
主要特点:
- 干净的拖放(没有视觉故障;我希望!
- 拖动时直观流畅的滚动。
- 支持异构项目高度。
- 公共 startDrag(( 和 stopDrag(( 方法。
- 用于自定义浮动视图的公共接口。