Флажок теряет состояние при прокрутке ListView

У меня есть представление списка с флажком в каждой строке, чтобы проверить много элементов одновременно. Когда я прокручиваю список вниз, мой флажок теряет состояние (это означает, что я не могу проверить, например, все элементы одновременно)

Я читаю много постов здесь и в интернете. Люди говорили, что мне нужно будет хранить свои проверенные элементы в "ArrayList", который я уже пробовал, но он не работал. В настоящий момент я сохраняю проверенное состояние в объекте вместе со всеми другими вещами из моего списка.

вот код моего Adapter`:

    public class GalleryListAdapter extends BaseAdapter {
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.gallery_list_item, parent, false);
            holder = new ViewHolder();
            // .. other stuff
            holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbox);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.chkbox.setChecked(documents.get(position).isChecked());
        holder.chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    holder.chkbox.setChecked(holder.chkbox.isChecked() ? true : false);
                    documents.get(position).setChecked(holder.chkbox.isChecked() ? true : false);
            }   
        }
    }
}

После того, как я прокручиваю список вниз, мои пункты не проверяются и documents.get(checkedItemPosition).checked является false, Кто-нибудь знает, как это исправить?

редактировать - решение

Благодаря комментариям и ответам я нашел решение для моей проблемы:

if (convertView == null) {
holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbox);
convertView.setTag(R.id.chkbox, holder.chkbox);
}

holder.chkbox.setTag(position);
holder.chkbox.setChecked(documents.get(position).isChecked());

holder.chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        int getPosition = (Integer) buttonView.getTag();
        holder.chkbox.setChecked(buttonView.isChecked() ? true : false);
        documents.get(getPosition).setChecked(buttonView.isChecked() ? true : false);
    }
}

3 ответа

Решение

В методе getView установите Tag для владельца флажка.

holder.chkbox.setTag(object);

и внутри onCheckedChanged сделать это

 **public onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

           Object obj = ( Object)buttonView.getTag();
           holder.chkbox.setChecked(obj.isChecked() ? true : false);
           documents.get(position).setChecked(obj.isChecked() ? true : false);
      }** 

Это поможет вам избавиться от этой проблемы;)

Когда я прокручиваю список вниз, мой флажок теряет состояние

Проблема с CheckBox внутри ListView заключается в том, что представление перерабатывается из-за прокрутки ListView, а значение Checkbox (check или uncheck) не поддерживается.

Чтобы сохранить состояние CheckBox, я предлагаю вам использовать TAG для флажка.

holder.chkbox.setTag(position); // This line is important.

Это связано с тем, что ListView скрывает дочерний элемент, который не отображается при прокрутке, это может привести к сбросу состояния CheckBox. Если вам не требуется, чтобы ваш флажок был структурирован внутри таблицы, возможно, вы можете вместо этого использовать ScrollView.

Другие вопросы по тегам