1

android:choiceMode="multipleChoice"のListViewがあります。このListViewは、カーソルからSimpleCursorAdapterを介して入力します。ListViewのCheckedTextViewレイアウトの「CheckBox」をカーソルからのブール値に直接バインドする方法は本当にありませんか?

現在、値がtrueの場合、ListView.setItemChecked()を呼び出してカーソルをループします。

private void showMyData(long myId) {
    // fill the list
    String[] fromColumns = { "myTextColumn" };
    int[] toViews = { android.R.id.text1 };
    Cursor myCursor = _myData.readData(myId);
    CursorAdapter myAdapter = new SimpleCursorAdapter(this,
        android.R.layout.simple_list_item_multiple_choice,
        myCursor, fromColumns, toViews);
    ListView myListView = (ListView) findViewById(R.id.myListView);
    myListView.setAdapter(myAdapter);
    // mark items that include the object specified by myId
    int myBooleanColumnPosition = myCursor
        .getColumnIndex("myBooleanColumn");
    for (int i = 0; i < myCursor.getCount(); i++) {
        myCursor.moveToPosition(i);
        if (myCursor.getInt(myBooleanColumnPosition ) == 1) {
            myListView.setItemChecked(i, true);
        }
    }
}

それが仕事をします。しかし、私はこのようなコードが欲しいです:

String[] fromColumns = { "myTextColumn", "myBooleanColumn" };
int[] toViews = { android.R.id.text1, android.R.id.Xyz };

ループはありません。ここで何かが足りないのですか、それともAndroidですか?

編集: Luksprogによって提案されたように私はこれを試しました:

public boolean setViewValue(View view, Cursor cursor,
        int columnIndex) {
    CheckedTextView ctv = (CheckedTextView) view;
    ctv.setText(cursor.getString(cursor
            .getColumnIndex("myTextColumn")));
    if (cursor.getInt(cursor.getColumnIndex("myBooleanColumn")) == 1) {
        ctv.setChecked(true);
        Log.d("MY_TAG", "CheckBox checked");
    }
    return true;
}

チェックボックスのチェックをログに記録しましたが、実際には実行しませんでした。多分それは私の側のバグです。そして、それは最初のループよりもさらに複雑ですが、少なくともフレームワークを使用していて、それに対して機能していないように感じます。だから、答えてくれたLuksprogに感謝します。

しかし、要約すると、Androidには実際には単純なアプローチが欠けています。

4

1 に答える 1

0

SimpleCursorAdapter.ViewBinderアダプターでを使用します。Cursorブール値の列が含まれていることを確認してから、次のようにします。

String[] fromColumns = { "myTextColumn" };
int[] toViews = { android.R.id.text1 };
Cursor myCursor = _myData.readData(myId);
CursorAdapter myAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, myCursor, fromColumns, toViews);
myAdapter.setViewBinder(new ViewBinder() {
       public boolean setViewValue (View view, Cursor cursor, int columnIndex) {
          // set the text of the list row, the view parameter (simple use cursor.getString(columnIndex))
          // set the CheckBox status(the layout used in the adapter is a CheckedTextView)
          return true;
       }
});
于 2012-11-14T15:43:52.447 に答える