在 SQLite DB 中使用 Drag-Sort ListView
Posted
技术标签:
【中文标题】在 SQLite DB 中使用 Drag-Sort ListView【英文标题】:Using Drag-Sort ListView with SQLite DB 【发布时间】:2012-09-10 11:22:17 【问题描述】:我正在尝试使用 SQLite DB 和 Drag-Sort ListView 创建一个简单的待办事项列表应用程序。
现在我正在使用 SimpleCursorAdapter 将 SQLite 数据库游标中的数据绑定到 ListView 中,并使用 EditText 视图添加项目,如tutorial 中所述。
我已将所有内容移到一个活动中,并将普通 ListView 与 Drag-Sort ListView 交换。我的问题是将数据库和 Drag-Sort ListView 连接在一起。 DLSV 演示使用预定义的数组来填充 DSLV。
片段形式的 DSLV:
DragSortListView lv = (DragSortListView) getListView();
lv.setDropListener(onDrop);
lv.setRemoveListener(onRemove);
array = getResources().getStringArray(R.array.jazz_artist_names);
list = new ArrayList<String>(Arrays.asList(array));
adapter = new ArrayAdapter<String>(this, R.layout.list_item1, R.id.text1, list);
setListAdapter(adapter);
我现有代码的片段:
mDbHelper = new NotesDbAdapter(this);
mDbHelper.open();
...
mDbHelper.createNote(noteName, "");
fillData();
private void fillData()
// Get all of the notes from the database and create the item list
Cursor c = mDbHelper.fetchAllNotes();
startManagingCursor(c);
String[] from = new String[] NotesDbAdapter.KEY_TITLE ;
int[] to = new int[] R.id.text1 ;
// Now create an array adapter and set it to display using our row
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
谢谢你,如果这没有多大意义,我们深表歉意。
【问题讨论】:
【参考方案1】:由于您无法重新排序 Cursor 中的项目,因此您必须在 Cursor 位置和 ListView 位置之间创建映射。这是由DragSortCursorAdapter 类和子类为您完成的,以便直观地维护拖放重新排序。如果您需要持久化新订单(如数据库),那么您必须自己实现该逻辑。方法getCursorPositions() 会帮你解决这个问题。
【讨论】:
诚然,我没有回过头来,所以我没有确认你的回答。但我非常感谢您的回复,并相信此信息确实回答了这个问题。如果我有任何澄清问题,我会再次发表评论。【参考方案2】:我已经使用了拖动排序列表视图。太奇妙了!但我没有使用 dragsortcursoradapter,而是创建了自己的技巧。在这里。
我所做的是,每当我交换任何项目时,我都会将数组中的新交换列表传递给数据库,删除表并重新创建新的更新表。这是我的代码 这是我的数据库处理程序中的代码 sn-p
public void onUpdateToDoTable(ArrayList<Task> taskList)
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKTODO);
String CREATE_TASK_TODO_TABLE = "CREATE TABLE IF NOT EXISTS "
+ TABLE_TASKTODO + "(" + SEQ_ID + " INTEGER PRIMARY KEY,"
+ TASK_NAME + " TEXT )";
db.execSQL(CREATE_TASK_TODO_TABLE);
for (int i = 0; i < taskList.size(); i++)
ContentValues values = new ContentValues();
values.put(TASK_NAME, taskList.get(i).getTask());
db.insert(TABLE_TASKTODO, null, values);
db.close();
然后使用 drop listener 我调用了上述方法..
private DragSortListView.DropListener onDrop = new DragSortListView.DropListener()
@Override
public void drop(int from, int to)
Task item = adapter.getItem(from);
adapter.notifyDataSetChanged();
adapter.remove(item);
adapter.insert(item, to);
db.onUpdateToDoTable(list);
Log.d("LIST", db.getAllToDoTasks().toString());
;
db 是我的数据库处理程序对象。完整的源代码可在dragdroplistview 获得。惊人的例子。这对我来说是救命稻草。咻!
【讨论】:
【参考方案3】:https://github.com/jmmcreynolds/dslv-db-demo 有一个 github 项目可供使用
此演示包含一个工作示例,说明如何设置 DragSortListView,它将您对列表所做的更改(位置、添加/删除)保存到数据库中。
我刚刚用过。其完美的演示项目可用于将 DSLV 与 SQLiteDB 结合使用。
感谢 github 用户 jmmcreynolds。
【讨论】:
以上是关于在 SQLite DB 中使用 Drag-Sort ListView的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Android 程序的 SQLite Manager 应用程序中使用我创建的 SQLite DB
使用在 Windows 中创建但要在 Android 中访问的 sqlite db