#android
#Android
Вопрос:
Я хотел бы реализовать прослушиватель щелчков для флажков ListView, который использует пользовательский адаптер. Вот так:
Я знаю о существовании режима выбора, но я хотел бы реализовать сам.
Я пытаюсь применять хорошие практики. Вот как выглядит мой адаптер:
public class TaskListAdapter extends ArrayAdapter<ListTask> {
private ArrayList<ListTask> mItems;
private ArrayList<Boolean> mChecked;
private LayoutInflater mInflater;
public TaskListAdapter(Context context, int textViewResourceId, ArrayList<ListTask> items) {
super(context, textViewResourceId, items);
this.mItems = items;
// Cache the LayoutInflate to avoid asking for a new one each time
mInflater = LayoutInflater.from(context);
// Initialize all checkboxes with false value
mChecked = new ArrayList<Boolean>();
for (int i = 0; i < this.getCount(); i ) {
mChecked.add(i, false);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_row, null);
holder = new ViewHolder();
holder.checkbox = (CheckBox) convertView.findViewById(R.id.mycheckbox);
holder.text = (TextView) convertView.findViewById(R.id.mytext);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MyList mylist = mItems.get(position);
holder.text.setText(mylist.getMyText());
// Create a listener for the CheckBox
holder.checkbox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (holder.checkbox.isChecked()) {
mChecked.set(position, true);
} else {
mChecked.set(position, false);
}
}
});
holder.checkbox.setChecked(mChecked.get(position));
return convertView;
}
static class ViewHolder {
CheckBox checkbox;
TextView text;
}
}
Когда я запускаю свое приложение, я получаю эту ошибку:
java.lang.Исключение IndexOutOfBoundsException: Недопустимое местоположение 0, размер равен 0
Эта ошибка вызвана строкой
holder.checkbox.setChecked(mChecked.get(position));
это непосредственно перед инструкцией return.
Если я прокомментирую это и повторно запущу приложение, оно покажет список, но когда я нажимаю на флажок, оно также выдает исключение IndexOutOfBoundsException для этой строки:
mChecked.set(position, true);
это находится внутри инструкции «if», которая проверяет, установлен ли флажок.
Что я делаю не так?
Ответ №1:
Вы проверили значение position? Также вы убедились, что ваш таргетинг на правильные просмотры и даже заполнение вашего списка? Скорее всего, вы не заполнили свой ListView. Насколько я помню, позиция не была той переменной, которая меня интересовала, когда дело дошло до ListView и флажков.
Комментарии:
1. Конечно, я заполняю свой ListView в своем классе list. Это всего лишь адаптер списка. Пожалуйста, не могли бы вы уточнить свой ответ? Где я должен проверить значение?
2. Эй, JoxTraex, ты был прав. Хотя я и заполнял свой список, я делал это после настройки своего адаптера. Теперь я заполнил его раньше, и это работает.
Ответ №2:
Вместо того, чтобы делать что-то вроде
for (int i = 0; i < this.getCount(); i ) { mChecked.add(i, false); }
попробуйте, как
for (int i = 0; i < mItems.size(); i ) { mChecked.add(i, false); }
Я думаю, ArrayList<ListTask>
что вы отправляете в конструктор, может быть null, проверьте это один раз.
Комментарии:
1. Метод getCount() не определен для типа ArrayList<ListTask>