Флажок теряет состояние при прокрутке ListView
У меня есть представление списка с флажком в каждой строке, чтобы проверить много элементов одновременно. Когда я прокручиваю список вниз, мой флажок теряет состояние (это означает, что я не могу проверить, например, все элементы одновременно)
Я читаю много постов здесь и в интернете. Люди говорили, что мне нужно будет хранить свои проверенные элементы в "ArrayList", который я уже пробовал, но он не работал. В настоящий момент я сохраняю проверенное состояние в объекте вместе со всеми другими вещами из моего списка.
вот код моего Adapter`:
public class GalleryListAdapter extends BaseAdapter {
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.gallery_list_item, parent, false);
holder = new ViewHolder();
// .. other stuff
holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.chkbox.setChecked(documents.get(position).isChecked());
holder.chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
holder.chkbox.setChecked(holder.chkbox.isChecked() ? true : false);
documents.get(position).setChecked(holder.chkbox.isChecked() ? true : false);
}
}
}
}
После того, как я прокручиваю список вниз, мои пункты не проверяются и documents.get(checkedItemPosition).checked
является false
, Кто-нибудь знает, как это исправить?
редактировать - решение
Благодаря комментариям и ответам я нашел решение для моей проблемы:
if (convertView == null) {
holder.chkbox = (CheckBox) convertView.findViewById(R.id.chkbox);
convertView.setTag(R.id.chkbox, holder.chkbox);
}
holder.chkbox.setTag(position);
holder.chkbox.setChecked(documents.get(position).isChecked());
holder.chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag();
holder.chkbox.setChecked(buttonView.isChecked() ? true : false);
documents.get(getPosition).setChecked(buttonView.isChecked() ? true : false);
}
}
3 ответа
В методе getView установите Tag для владельца флажка.
holder.chkbox.setTag(object);
и внутри onCheckedChanged сделать это
**public onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Object obj = ( Object)buttonView.getTag();
holder.chkbox.setChecked(obj.isChecked() ? true : false);
documents.get(position).setChecked(obj.isChecked() ? true : false);
}**
Это поможет вам избавиться от этой проблемы;)
Когда я прокручиваю список вниз, мой флажок теряет состояние
Проблема с CheckBox внутри ListView заключается в том, что представление перерабатывается из-за прокрутки ListView, а значение Checkbox (check или uncheck) не поддерживается.
Чтобы сохранить состояние CheckBox, я предлагаю вам использовать TAG для флажка.
holder.chkbox.setTag(position); // This line is important.
Это связано с тем, что ListView скрывает дочерний элемент, который не отображается при прокрутке, это может привести к сбросу состояния CheckBox. Если вам не требуется, чтобы ваш флажок был структурирован внутри таблицы, возможно, вы можете вместо этого использовать ScrollView.