Настройка Первоначально проверено CheckedTextViews в ListView для choiceMode = «множественный выбор»

1

У меня очень трудное время, пытаясь работать с режимом 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. Есть ли где-то еще, что я должен делать это, или я просто делаю это неправильно?

Теги:

2 ответа

7
Лучший ответ

Вызовите setItemChecked() в ListView для каждой отмеченной позиции.

  • 0
    Спасибо! Цикл, который я установил вчера вечером в onCreate для активности списка, теперь прекрасно работает.
  • 1
    Почему происходит сбой setChecked (true) в getView () в ListAdapter? Неужели нам снова нужно перебирать список?
Показать ещё 3 комментария
0

У меня также были проблемы с этим и собрали это решение. Я думал о передаче 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);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню