如何将额外的元素插入到一个SimpleCursorAdapter或一个Spinner的光标?

我有一个微调,这是显示从数据库中获取的数据列表。 数据从查询返回到游标,并将游标传递给微调器的SimpleCursorAdapter。 它工作正常,但我想在这个数据上插入另一个项目。 例如,微调框已经显示了保存在DB中的用户创build的模板列表,但是我想在模板列表的顶部插入“新模板”和“空模板”,并且需要将其插入到Cursor / SimpleCursorAdapter不知何故。

我已经考虑使用数组列表,并从光标填充数组列表,但光标是我的更好的解决scheme,因为它也包含其他相关的数据行。 我search了其他解决scheme的互联网,并find了一些答案,要求使用CursorWrapper为此目的,但我找不到一个具体的例子如何使用CursorWrapper来实现我想要的。 我怎样才能插入一些行在游标或可以有人请给一个容易遵循CursorWrapper的例子! 提前致谢。

Solutions Collecting From Web of "如何将额外的元素插入到一个SimpleCursorAdapter或一个Spinner的光标?"

您可以将MergeCursorMatrixCursor的组合与您的DB cursor一样使用:

 MatrixCursor extras = new MatrixCursor(new String[] { "_id", "title" }); extras.addRow(new String[] { "-1", "New Template" }); extras.addRow(new String[] { "-2", "Empty Template" }); Cursor[] cursors = { extras, cursor }; Cursor extendedCursor = new MergeCursor(cursors); 

这是我试过的方法。

 MatrixCursor m = new MatrixCursor(c.getColumnNames()); Cursor c = DBHelper.rawQuery("Select values from your_table"); MatrixCursor m = new MatrixCursor(c.getColumnNames()); //Use MatrixCursor#addRow here to add before the original cursor while (c.moveToNext()) { //Use MatrixCursor#addRow here to add before the original row DBHelper.insertRow(c, m); //Use MatrixCursor#addRow here to add after the original row } //Use MatrixCursor#addRow here to add after the original cursor m.addRow(new String[]{col1Val, col2Val, col3Val,..., //to match the number of columns needed}); 

DBHelper.insertRow()

 public final static void insertRow(Cursor from, MatrixCursor to) { final String columns[] = from.getColumnNames(), values[] = new String[columns.length]; final int size = columns.length; for (int i = 0; i < size; i++) { values[i] = getStringFromColumn(from, columns[i]); } to.addRow(values); } 

使用这种方法,您可以在游标的任何位置添加任意数量的行。 即使不使用CursorWrapper,也可以使用CursorAdapters或SimpleCursorAdapters。

我尝试了@naktinis提供的解决scheme,但结果不是我所期望的。 我自己想要实现的作为一个适配器,其中可以在顶部添加新的元素(索引0)。 然而,在给出的解决scheme中,新的元素确实被添加到顶部,但是仅添加到matrix游标的结束处。 换句话说,当我将行dynamic地添加到“extras”MatrixCursor时,我得到了这样的东西:

  • “额外”行1
  • “额外”行2
  • “额外”行3
  • “光标”行1
  • “游标”第2行
  • “光标”行3。

但是,我真正想要达到的是这样的:

  • “额外”行3
  • “额外”行2
  • “额外”行1
  • “光标”行1
  • “游标”第2行
  • “光标”行3。

换句话说,最近的元素input在顶部(索引0)。

我可以通过以下手动来实现这一点。 请注意,我没有包含任何逻辑来处理从适配器中dynamic移除元素。

 private class CollectionAdapter extends ArrayAdapter<String> { /** * This is the position which getItem uses to decide whether to fetch data from the * DB cursor or directly from the Adapter's underlying array. Specifically, any item * at a position lower than this offset has been added to the top of the adapter * dynamically. */ private int mCursorOffset; /** * This is a SQLite cursor returned by a call to db.query(...). */ private Cursor mCursor; /** * This stores the initial result returned by cursor.getCount(). */ private int mCachedCursorCount; public Adapter(Context context, Cursor cursor) { super(context, R.layout.collection_item); mCursor = cursor; mCursorOffset = 0; mCachedCursorCount = -1; } public void add(String item) { insert(item, 0); mCursorOffset = mCursorOffset + 1; notifyDataSetChanged(); } @Override public String getItem(int position) { // return the item directly from underlying array if it was added dynamically. if (position < mCursorOffset) { return super.getItem(position); } // try to load a row from the cursor. if (!mCursor.moveToPosition(position - mCursorOffset)) { Log.d(TAG, "Failed to move cursor to position " + (position - mCursorOffset)); return null; // this shouldn't happen. } return mCursor.getString(INDEX_COLLECTION_DATA); } @Override public int getCount() { if (mCachedCursorCount == -1) { mCachedCursorCount = mCursor.getCount(); } return mCursorOffset + mCachedCursorCount; } } 

我发现了一些关于将元素添加到具有SimpleCursorAdapter的微调器的信息: http ://groups.google.com/group/android-developers/browse_thread/thread/4123868e02fc9172