3

如果您只想在没有上下文的情况下查看问题,请跳到底部

我正在构建的 android 应用程序有一个包含三列的简单表:

_id INTEGER PRIMARY KEY...,名称TEXT,颜色INT

此表称为categories。我从数据库中加载我的类别并将它们输入一个SimpleCursorAdapter以供使用,Spinner如下所示:

String[] from = new String[] {
        ListDbAdapter.KEY_CATEGORY_NAME,
        ListDbAdapter.KEY_CATEGORY_COLOR };
int[] to = new int[] { R.id.categorySpinnerItem };

mCategorySpinnerAdapter = new SimpleCursorAdapter(this,
    R.layout.category_spinner_item, categoryCursor, from, to);

mCategorySpinnerAdapter
    .setViewBinder(new CategorySpinnerViewBinder());
mCategorySpinner.setAdapter(mCategorySpinnerAdapter);

我设置了一个自定义ViewBinder,因为我希望类别名称是微调项的文本,颜色是背景颜色。我的ViewBinder样子是这样的:

private static final int NAME_COLUMN = 1;
private static final int COLOR_COLUMN = 2;

@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

    TextView textView = (TextView) view;

    String name = cursor.getString(NAME_COLUMN);
    int color = cursor.getInt(COLOR_COLUMN);

    textView.setText(name);
    textView.setBackgroundColor(color);

    return true;
}

这是我的问题(最后)

setViewValue方法中,columnIndex应该做什么?文档说“可以在光标中找到数据的列”但是当我通过setViewValue进行调试时,我点击了它三次,并且columnIndex始终为1.

我期待调试器为 from 数组中的每个条目进入setViewValue一次,首先是 columnIndex 1,然后是2。或者可能对查询结果中的每一列执行一次。

上面的代码有效,我可以获得所需的功能,但这仅仅是因为我的 NAME_COLUMN 和 COLOR_COLUMN 常量。我真的很想听听对自定义 ViewBinders 更有经验的人对setViewValue及其参数的解释。

4

2 回答 2

1

我认为您很困惑,因为您错过了返回值的部分 - 如果您绑定数据,则为 true,否则为 false(并且适配器尝试自行处理绑定)。我认为这个想法就像OnTouchEvent- 让您可以选择是否使用它。因此,您始终在索引 1 处返回 true,并且从未提供过索引 2,因为您已经绑定了视图,这是我能想到的关于 columnIndex 参数中始终只有 1 的唯一解释。

但是,我几乎没有使用过游标适配器 - 我发现它们不是 OO,最好在其他地方创建一个 POJO,使用 db 列进行初始化,并且当你有一个形状的对象列表时,它只是发送他们到一个“正常”的适配器,听起来更像是 MVC。例如,如果在某个时候您决定KEY_CATEGORY_NAME将采用“cat_name##cat_description”格式(例如),您必须更改Adapter. 更改您的类类别听起来更合理,因此 getName() 将仅返回“cat_name”,并且适配器是相同的。

所以,因为我几乎没有使用过CursorAdapters,如果我对 columnIndex 的看法是正确的,请务必告诉我,因为我很好奇,但我不想创建一个 CursorAdapter 并自己检查它:)

于 2010-11-16T02:51:58.507 回答
1

在 SimpleCursorAdapter 的源代码中,setViewValue调用了bindView

bound = binder.setViewValue(v, cursor, from[i]);

其中来自 [i]的第三个参数是有趣的参数,它是对int[]的迭代,它表示使用的列索引。但是,迭代本身的[i]索引来自int[]传递给适配器的构造函数,在您的情况下,它只有一项 - R.id.categorySpinnerItem

编辑:在两个词中,String[] 和 int[] 应该是等价的,相同的大小和相同的顺序 - 对于每个列名,您需要一个 int R.id ...第一个视图 id 将连接到第一列id 使用 from[0],第二个使用 from[1] 依此类推,如果您传递 10 列,但您只有 3 个 R.id-s,您将只能获得 from[2] :)

于 2010-11-16T04:25:02.717 回答