在 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

在 Flutter 中访问 SQLite DB

扩展SQLite使其能从apk文件中读取db

如何在 Spring Maven WAR 中指定 SQLite db 文件的位置

如何在 Visual Basic 2010 中使用 sqlite db?