3

コンテキストなしで質問を見たいだけの場合は、一番下にスキップしてください

私が構築しているAndroidアプリには、3つの列を持つ単純なテーブルがあります。

_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を使用してデバッグすると、3回ヒットし、columnIndexは常に1です。

from配列のエントリごとに、デバッガーがsetViewValue1に1回入ることを期待していました。最初にcolumnIndexがあり、次に2。または、クエリ結果の列ごとに1回ずつです。

上記のコードは機能しますが、NAME_COLUMN定数とCOLOR_COLUMN定数が原因で、目的の機能を取得できます。カスタムViewBindersの経験が豊富な人から、 setViewValueとそのパラメーターの説明を聞いてみたいと思います。

4

2 に答える 2

1

戻り値のある部分を見逃したため、混乱していると思います-データをバインドする場合はtrue、そうでない場合はfalse(そしてアダプターはバインディングを独自に処理しようとします)。アイデアは - のようなものだと思いますOnTouchEvent。それを消費するかどうかを選択できます。したがって、インデックス 1 で常に true を返し、インデックス 2 が提供されることはありません。既にビューをバインドしているためです。

ただし、カーソルアダプターはほとんど使用していません-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]);

ここで、興味深いものであるfrom[i]の 3 番目のパラメーターは、使用される列インデックスを表すint[]の反復です。ただし、反復自体の[i]のインデックスは、アダプターのコンストラクターに渡されるint[] から取得されます。この場合、項目は 1 つだけです - R.id.categorySpinnerItem

EDIT:2つの言葉で、String []とint []は同等で、同じサイズで同じ順序でなければなりません-列名ごとにint R.idが必要です...最初のビューIDは最初の列に接続されますfrom[0] の id、from[1] の 2 番目など、10 列を渡す場合、R.id-s が 3 つしかない場合、from[2] にしか取得できません :)

于 2010-11-16T04:25:02.717 に答える