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

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

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

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

Я понимаю, что это как-то связано с тем, как Android повторяет представление, но я не вижу, как это исправить! Кто-нибудь может мне помочь???

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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;
        }

Всегда имейте в виду, используйте изменения 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
    }
}
Другие вопросы по тегам