CheckBox in ListView wird zurückgesetzt, wenn es den Bildschirm verlässt

Ich bin dem Tutorial gefolgtHie um ein benutzerdefiniertes @ zu erstellListView zeigt Elemente mit Kategorieüberschriften an. Ich habe das @ geändelist_item_entry.xml ein @ setzCheckBox im Item:

<?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>

Mein Problem ist, dass, wenn ich einige der @ überprüfCheckBoxes Scrollen Sie sie dann vom Bildschirm, wenn sie zurückkommen, sind sie deaktiviert. JedochlistView.getCheckedItemPositions() zeigt immer noch, dass der Artikel @ ichecked.

Ich bin mir ziemlich sicher, dass mein Problem mit dem @ igetView() Methode in meinem benutzerdefiniertenArrayAdapter:

@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;
 }

Ich denke, dass ich hier zwei Probleme habe, obwohl ich auch keine Ahnung habe, wie ich sie lösen soll:

Usingvi.inflate Jedes Mal verursacht Android ständig Ansichten zu erstellen, was schlecht ist (nicht sicher, ob dies der Fall ist). Ich habe versucht, es nur aufzublasen, wennconvertView == null aber dann manchmalconvertView würde im falschen Format sein, dh.List_item_section wann sollte es seinList_item_entry. Ist es in Ordnung, es jedes Mal aufzublasen?

Ich denke, dass das Aufblasen der Ansicht jedes Mal das @ verursacCheckBoxes zurückgesetzt werden, obwohl ich diesbezüglich möglicherweise falsch liege.

So wie mache ich es damit die CheckBoxen beim Verlassen aktiviert bleiben und zum Bildschirm zurückkehren? Und füllt diese Methode den Android-Speicher mit Views, wenn die Liste lang genug ist?

Aktualisiere: Ich mochte die Antwort von @ user3815165, weil ich das @ nicht speichern musstchecked Wert für einsectionItem, das keine Checkbox hat. Aber wie ich in einem Kommentar erwähnte, da dasitems Liste ist nicht im Kontext der Aktivität dann die Werte, ob jedesEntryItem ist markiert oder bleibt nicht erhalten, wenn die Ansicht zerstört wird und Fehler verursacht.

So habe ich mich für @ Palashs Antwort entschieden, obwohl darin keine Daten gespeichert wurden (nur ein einzigesboolean Wert für jedesSectionItem In der Liste). Es funktioniert perfekt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage