Просмотр списка с флажками и прослушивателем щелчков

#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>