Android 有助于理解ViewBInder中的columnIndex

Android 有助于理解ViewBInder中的columnIndex,android,android-viewbinder,Android,Android Viewbinder,如果您只想查看没有上下文的问题,请跳到底部 我正在构建的android应用程序有一个简单的表,表中有三列: \u id整数主键…,名称文本,颜色INT 此表称为类别。我从数据库中加载我的类别,并将它们输入到SimpleCursorAdapter中,以便与微调器一起使用,如下所示: String[] from = new String[] { ListDbAdapter.KEY_CATEGORY_NAME, ListDbAdapter.KEY_CATEGORY_CO

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

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

\u id整数主键…,名称文本,颜色INT

此表称为
类别
。我从数据库中加载我的类别,并将它们输入到
SimpleCursorAdapter
中,以便与
微调器一起使用,如下所示:

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一次,列索引首先是
1
,然后是
2
。或者,对于查询结果中的每一列,可能只执行一次


上面的代码可以工作,我可以获得所需的功能,但这仅仅是因为我的NAME\u COLUMN和COLOR\u COLUMN常量。我真的很想听听对自定义viewbinder更有经验的人对setViewValue及其参数的解释。

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

然而,我几乎没有使用游标适配器——我发现它们不是OO,最好在其他地方创建POJO,使用db列以您想要的方式初始化它,并且当您有一个对象的成形列表只是将它们发送到“普通”适配器时,听起来更像MVC。例如,如果在某个时刻您决定
密钥类别名称
的格式为“cat_NAME##cat_description”(例如),则必须更改
适配器
。更改类类别听起来更合理,因此getName()将只返回“cat_name”,适配器也是一样的


因此,因为我几乎没有使用过
CursorAdapter
,如果我对columnIndex的看法正确,请告诉我它的情况,因为我很好奇,但我不想创建一个CursorAdapter并亲自检查:)

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

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


编辑:总之,字符串[]和int[]应该相等,大小相同,顺序相同-对于每个列名,您需要一个int R.id。。。第一个视图id将通过from[0]连接到第一个列id,第二个通过from[1]连接到第二个列id,依此类推,如果您通过了10个列,但只有3个R.id-s,则只能从[2]连接到:)

Dang我真的希望这就是答案!但是,在我的测试中,无论我返回true还是false,我总是返回以1作为columnIndex的方法。我甚至每次都返回false,但结果没有改变。我的视图文本和颜色仍然设置,columnIndex从未更改!嘿,检查SimpleCursorAdapter的源代码,它都在那里,我会把它作为一个新的答案来写,这样我可以标记代码,它会比注释长,可能是一个很好的想法,我以前没有想过看源代码。你说的很有意思。因此,我认为columnIndex唯一有用的时间是当您的to数组中有多个视图时。或这是否意味着我的to数组应该具有与我的from数组相同的值,即使它多次表示相同的值(to=new int[]{R.id.categorySpinnerItem,R.id.categorySpinnerItem})?我明天还要再玩一点。现在我记得是这样的,这实际上是唯一有意义的方法,但我忘记了:)所以你必须更改你的代码,你不能操纵一个视图和两列(一列代表名称,一列代表颜色)@binary lobster-这意味着列#1将设置文本视图#1的文本,#2代表#2等等