Пользовательский список с проблемой флажка
Я пытаюсь создать настраиваемый список, который будет иметь флажки, которые позволят вам выбрать несколько элементов из списка.
Список с флажками отображается нормально, но если я установил флажок, а затем прокрутил другие элементы дальше, список также будет проверен.
В основном та же проблема, что и здесь
Я понимаю, что это имеет какое-то отношение к тому, как андроид перерабатывает представление, но я не могу понять, как это исправить! Может кто-нибудь мне помочь???
Спасибо - Майк
Ответы
Ответ 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
}
}