Пользовательский просмотр списка с проблемой флажка - PullRequest
6 голосов
/ 26 марта 2011

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 26 марта 2011

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

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

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

2 голосов
/ 22 июля 2011

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

0 голосов
/ 20 января 2015

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

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
    }
}
0 голосов
/ 26 марта 2011

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

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

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

...