Пользовательский список с проблемой флажка

Я пытаюсь создать настраиваемый список, который будет иметь флажки, которые позволят вам выбрать несколько элементов из списка.

Список с флажками отображается нормально, но если я установил флажок, а затем прокрутил другие элементы дальше, список также будет проверен.

В основном та же проблема, что и здесь

Я понимаю, что это имеет какое-то отношение к тому, как андроид перерабатывает представление, но я не могу понять, как это исправить! Может кто-нибудь мне помочь???

Спасибо - Майк

Ответы

Ответ 1

Вам нужна структура данных, чтобы отслеживать, какие строки проверяются. Это может быть так же просто, как bool[] checked.

В getView убедитесь, что вы установили состояние флажка в содержимое checked[position]. Вы также должны установить OnCheckedChangedListener в своих флажках в getView, чтобы они обновили ваши данные с помощью checked[position] = isChecked.

Да, строки в ListView переработаны, поэтому перед тем, как оставить getView, не забудьте заполнить все соответствующие данные для строки.

Ответ 2

Вы можете попробовать использовать OnClickListener для флажка вместо OnCheckChangedListener. Это сработало для меня.

Ответ 3

Создайте ArrayList<Integer>. добавьте OnCheckChangedListener в свой флажок. Внутри измененного метода добавьте или удалите представление списка position в ArrayList<Integer>.

в вашем методе getView, проверьте, содержит ли ArrayList<Integer> текущий вид списка position. если он содержит позицию, установите флажок в true, иначе false.

каждый раз, когда вы нажимаете флажок, добавьте или удалите Integer из ArrayList.

Ответ 4

Проверьте код ниже -

public View getView(int position, View convertView, ViewGroup parent){
            View view = convertView;
            ViewHolder holder = new ViewHolder();

            if(view == null){

                view = inflater.inflate(R.layout.list_callcycle_blue, null);                
                holder.llContainer = (LinearLayout) view.findViewById(R.id.ll_container);
                holder.lblLabel = (TextView) view.findViewById(R.id.txt_desc);
                holder.cb = (CheckBox) view.findViewById(R.id.cb_store);

                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }

            final Object data = getItem(position);
            holder.lblLabel.setText(data.getDescription());

            holder.cb.setTag(position);
            holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    int position = (Integer) buttonView.getTag();
                    objects.get(position).setChecked(buttonView.isChecked());
                }
            });
            holder.cb.setChecked(isChecked(position));

            return view;
        }

Всегда помните, используйте change holder.cb.setOnCheckedChangeListener() т.е. любой прослушиватель перед установкой данных, в нашем случае это holder.cb.setChecked()

Причина:. Когда мы прокручиваем, listview будет перерабатывать представления, поэтому, если setchecked используется перед слушателями, тогда он будет выбирать значения на основе старого слушателя. И если мы установим его после слушателя, то он примет последние значения

СОЕДИНЕННАЯ ЧАСТЬ Ниже будет показано, как методы isChecked() и setChecked() используются для извлечения проверенных данных

/*
 * This function is in your Custom Adapter Class
 */
private boolean isChecked(int position){
    return object(position).isChecked();
}


/**
 * Getter Setter Class / Data Model Class that defines your object
 */
private class MyObject{
    private boolean isChecked;
    private String a, b, c, orWhateverYourObjectNeeds;

    public void setChecked(boolean isChecked){
        this.isChecked = isChecked;
    }

    public boolean isChecked(){
        return isChecked
    }
}