Как связать CheckBox в множественном ListView с логическим значением с помощью SimpleCursorAdapter?
У меня есть ListView с Android:choiceMode="множественный выбор". Я заполняю этот ListView из курсора через SimpleCursorAdapter. Неужели нет способа напрямую связать "CheckBox" макета CheckedTextView ListView с логическим значением из курсора?
В настоящее время я перебираю курсор, вызывая ListView.setItemChecked(), если значение равно true:
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;
}
Это регистрировало проверку CheckBox, но фактически не делало этого. Может быть, это ошибка на моей стороне. И хотя он еще более сложен, чем начальный цикл, по крайней мере кажется, что он использует фреймворк, а не работает против него. Так что спасибо Luksprog за ответ.
Но подведем итог: в Android фактически отсутствует прямой подход.
1 ответ
Использовать 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;
}
});