У меня очень трудное время, пытаясь работать с режимом Android ViewView multiChoice. Вот что я пытаюсь сделать:
У меня есть кнопка "игроки" на экране настройки игры. Когда это щелкнуть, он открывает другое действие с помощью multipleChoice ListView всех игроков в базе данных в CheckedTextViews. Я работаю правильно, и когда вы нажимаете на игрока, они будут добавлены или удалены из игры через запрос в таблицу game_players.
Проблема заключается в настройке ListView, чтобы игроки, которые уже были добавлены в игру, сначала проверяются, когда открывается активность.
Я попытался сделать это, выполнив итерацию по всему списку в элементе ListView, но это не сработает, потому что просмотры, которые в настоящее время не видны, не могут быть доступны для проверки.
Итак, теперь я пытаюсь сделать это в своем расширенном SimpleCursorAdapter в bindView, но я даже не могу заставить этот простой код работать:
@Override
public void bindView(View _view, Context _context, Cursor _cursor) {
String name = c.getString(c.getColumnIndexOrThrow(from[0]));
this.player = (CheckedTextView)_view.findViewById(to[0]);
this.player.setText(name);
this.player.setChecked(true);
}
Он правильно задает имя игрока с помощью setText(), но я не могу получить ни одного из полей для проверки bindView. Есть ли где-то еще, что я должен делать это, или я просто делаю это неправильно?
Вызовите setItemChecked()
в ListView
для каждой отмеченной позиции.
У меня также были проблемы с этим и собрали это решение. Я думал о передаче ListView непосредственно в адаптер, но вместо этого решил создать интерфейс, чтобы избежать циклической ссылки между ListView и адаптером.
Интерфейс, чтобы свободно привязать адаптер к списку:
public interface CheckControl {
public void setChecked(int position, boolean value);
}
Пользовательский адаптер:
private class MyAdapter extends CursorAdapter {
private CheckControl checkControl;
public MyAdapter(Context context, Cursor cursor, CheckControl checkControl) {
super(context, cursor, 0);
this.checkControl = checkControl;
...
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
...
checkControl.setChecked(cursor.getPosition(), cursor.getInt(COL_ENABLED) == 1);
...
}
}
И вот как я использую эти два элемента. В моем случае я расширяю ListViewFragment, но то же самое можно сделать и в любом другом классе, который содержит ListView.
public class MyListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
....
CheckControl checkControl = new CheckControl() {
public void setItemChecked(int position, boolean checked) {
getListView().setItemChecked(position, checked);
}
};
setListAdapter(new MyAdapter(getActivity(), null, checkControl));
// Kick off the loader
getLoaderManager().initLoader(LOADER_1, null, this);
}
}