【问题标题】:Using Drag-Sort ListView with SQLite DB在 SQLite DB 中使用 Drag-Sort ListView
【发布时间】: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);
   }

谢谢你,如果这没有多大意义,我们深表歉意。

【问题讨论】:

    标签: drag-and-drop android-listview android-arrayadapter listactivity android-sqlite


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 2013-03-31
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多