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