CheckBox в ListView сбрасывается, когда он покидает экран
Я следовал за учебникомВот создать кастомListView
это показывает элементы с заголовками категорий. Я изменилlist_item_entry.xml
положитьCheckBox
в пункте:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize" >
<CheckBox
android:id="@+id/option_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:focusable="false"
android:clickable="false" />
<TextView
android:id="@+id/list_item_entry_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:ellipsize="marquee"
android:fadingEdge="horizontal" />
</LinearLayout>
Моя проблема в том, что если я проверю некоторые изCheckBoxes
затем прокрутите их с экрана, когда они возвращаются, они не проверены. тем не мениеlistView.getCheckedItemPositions()
по-прежнему показывает, что элементchecked
.
Я уверен, что моя проблема сgetView()
метод в моем обычаеArrayAdapter
:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Item i = items.get(position);
if (i != null) {
if(i.isSection()){
SectionItem si = (SectionItem)i;
convertView = vi.inflate(R.layout.list_item_section, parent, false);
convertView.setOnClickListener(null);
convertView.setOnLongClickListener(null);
convertView.setLongClickable(false);
final TextView sectionView =
(TextView) convertView.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
}else{
EntryItem ei = (EntryItem)i;
convertView = vi.inflate(R.layout. list_item_entry, parent, false);
final TextView title =
(TextView) convertView.findViewById(R.id.list_item_entry_title);
if (title != null)
title.setText(ei.getTitle());
}
}
return convertView;
}
Я думаю, что у меня есть две проблемы здесь, хотя я не знаю, как их решить:
С помощьюvi.inflate
каждый раз заставляет андроид постоянно создавать представления, что плохо (не уверен в этом). Я пытался только надуть его, еслиconvertView == null
но иногдаconvertView
будет в неправильном формате, т.е.List_item_section
когда это должно бытьList_item_entry
, Разве это нормально раздувать это каждый раз?
Я думаю, что раздувание зрения каждый раз вызываетCheckBoxes
быть сброшенным, хотя я могу ошибаться по этому поводу.
Так как мне сделать так, чтобы CheckBoxes оставались проверенными при выходе и возвращались на экран? И будет ли этот метод заполнять память Android представлениями, если список достаточно длинный?
Обновить: Мне понравился ответ @ user3815165, потому что мне не нужно было хранитьchecked
значение дляsectionItem
который не имеет флажок. Но, как я уже упоминал в комментарии, так какitems
список не в контексте действия, то значения каждогоEntryItem
проверяется или не сохраняется, когда представление уничтожается и создает ошибки.
Поэтому я решил пойти с ответом @ Palash, несмотря на то, что он хранил ненужные данные (только одинboolean
значение для каждогоSectionItem
в списке). Работает отлично.