如何将项目添加到SimpleCursorAdapter?

时间:2011-12-14 17:10:40

标签: android simplecursoradapter

我有一个简单的数据库表,其中包含2列“_id”和“title”。 我在旋转器中显示数据,效果很好。

但是我需要在微调器列表顶部添加一个项目,该项目不是来自id = 0且title =“not specified”的数据库;

Spinner list = (Spinner) findViewById(R.id.spinner);
Cursor cursor = database.getAll(); // returns cursor with objects

String[] columns = new String[] {"title"};
int[] to = new int[] {R.id.title};

list.setAdapter(new SimpleCursorAdapter(this, R.layout.object_item_simple, cursor, columns, to));

我需要知道数据库中所选的项目ID,我可以使用list.getSelectedItemId();

执行此操作

所以我不能使用ArrayAdapter而不是SimpleCursorAdapter,因为我认为没有一种方法可以为适配器上的每个项目设置id。 有没有办法做到这一点?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用您的ID和标题创建一个对象,并使用光标构建这些对象的列表。然后在该列表的顶部插入您的人工条目。

然后在此列表中构建适配器传递时。

或者你可以将一个虚拟值放入你的数据库,虽然这很奇怪,也许根据你的查询和数据不可能。 ArrayAdapter更明智

答案 1 :(得分:1)

如何使用SimpleCursorAdapter

执行此操作

此方法:

  • 效率高
  • 使用标准CursorLoaderSimpleCursorAdapter成语
  • 非常适合ContentProvider数据

我创建了想要作为静态MatrixCursor

插入光标的项目
private static final MatrixCursor PLATFORM_HEADER_CURSOR = new MatrixCursor(
        //These are the names of the columns in my other cursor
        new String[]{ 
                DataContract.ReflashPackage._ID,
                DataContract.ReflashPackage.COLUMN_PLATFORM
        });
static {
    PLATFORM_HEADER_CURSOR.addRow(new String[]{
            "0",
            "Select a Platform")
    });
}

这是onLoadFinished的实现,它将光标合并并将其传递给适配器。

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    switch (loader.getId()) {
        case PLATFORM_CURSOR_LOADER_ID:
            Cursor mergedCursor = addPlatformHeaderToCursor(data);
            mPlatformAdapter.swapCursor(mergedCursor);
            break;
    }
}

@NonNull
private static Cursor addPlatformHeaderToCursor(Cursor platforms) {
    Cursor[] cursorToMerge = new Cursor[2];
    cursorToMerge[0] = PLATFORM_HEADER_CURSOR;
    cursorToMerge[1] = platforms;
    return new MergeCursor(cursorToMerge);
}

答案 2 :(得分:0)

我经常使用的一种技术是我将定义一个对象(例如EntryObject),它具有我需要从光标显示的变量。一旦我有了这个,我可以遍历游标并将信息放入那些EntryObjects并将它们放在ArrayList或数组中。

然后,您可以构建一个客户ArrayAdapter,它将与您的新对象一起使用,以根据需要提取尽可能多的数据,并以您希望的方式显示它。