Status der Kontrollkästchen in der Listenansicht mit CursorAdapter beibehalten

Für mein Android-Projekt habe ich eine Listenansicht mit einem Kontrollkästchen für jedes Element. Die Daten werden mithilfe einer CursorAdapter-Klasse aus einer SQLite-Datenbank geladen. Wenn ich jedoch scrolle, werden die Kontrollkästchenpositionen verschoben und in den nächsten Teil der Listenansicht verschoben. Wie kann ich dieses Problem beheben?GIF meiner CheckBox Problem Hier ist meine Cursor-Adapter-Klasse:

public class VocabCursorAdapter extends CursorAdapter {

private static final int DIFFICULT = 0;
private static final int FAMILIAR = 1;
private static final int EASY = 2;
private static final int PERFECT = 3;

public VocabCursorAdapter(Context context, Cursor c, int flags) {
    super(context, c, 0);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context).inflate(R.layout.item_vocab, parent, false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    // Find fields to populate in inflated template
    TextView tvVocabName = (TextView) view.findViewById(R.id.vocabName);
    TextView tvVocabDefinition = (TextView) view.findViewById(R.id.vocabDefinition);
    ImageView tvVocabLevel = (ImageView) view.findViewById(R.id.vocabLevel);
    // Extract properties from cursor
    String vocab = cursor.getString(cursor.getColumnIndexOrThrow(VocabDbContract.COLUMN_NAME_VOCAB));
    String definition = cursor.getString(cursor.getColumnIndexOrThrow(VocabDbContract.COLUMN_NAME_DEFINITION));
    int level = cursor.getInt(cursor.getColumnIndexOrThrow(VocabDbContract.COLUMN_NAME_LEVEL));
    // Populate fields with extracted properties
    tvVocabName.setText(vocab);
    tvVocabDefinition.setText(definition);

    if (level == DIFFICULT) {
        tvVocabLevel.setImageResource(R.drawable.level_bars_difficult);
        tvVocabLevel.setTag(DIFFICULT);
    }
    else if (level == FAMILIAR) {
        tvVocabLevel.setImageResource(R.drawable.level_bars_familiar);
        tvVocabLevel.setTag(FAMILIAR);
    }
    else if (level == EASY) {
        tvVocabLevel.setImageResource(R.drawable.level_bars_easy);
        tvVocabLevel.setTag(EASY);
    }
    else if (level == PERFECT) {
        tvVocabLevel.setImageResource(R.drawable.level_bars_perfect);
        tvVocabLevel.setTag(PERFECT);
    }
}

Und hier ist meine Liste item xml, item_vocab.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:longClickable="true">

<ImageView
    android:layout_width="36sp"
    android:layout_height="36sp"
    android:id="@+id/vocabLevel"
    android:layout_gravity="right"
    android:src="@drawable/level_bars"
    android:scaleType="fitXY"
    android:contentDescription="@string/vocab_level"
    android:layout_centerVertical="true"
    android:layout_toLeftOf="@+id/editCheckbox"
    android:layout_toStartOf="@+id/editCheckbox"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Large Text"
    android:id="@+id/vocabName"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_toLeftOf="@+id/vocabLevel"
    android:layout_toStartOf="@+id/vocabLevel"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:text="Small Text"
    android:id="@+id/vocabDefinition"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_toLeftOf="@+id/vocabLevel"
    android:layout_toStartOf="@+id/vocabLevel"
    android:layout_below="@id/vocabName"/>

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editCheckbox"
    android:layout_centerVertical="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"/>

</RelativeLayout>

Und hier ist meine XML, die eine Listenansicht enthält

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".controller.MyVocab"
            android:paddingLeft="5dp">

<ListView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/mVocabList"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"/>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/empty_text_view"
    android:id="@android:id/empty"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"/>

</RelativeLayout>

Ich habe mir viele verschiedene Lösungen für StackOverflow angesehen, konnte sie jedoch in meiner eigenen App nicht erfolgreich ausführen. Zum Beispiel diesesPos hat ein ähnliches Problem, aber die Lösung verwendete getView und ich hatte Probleme zu verstehen, wie man es mit newView und bindView implementiert.

Und einige andere Lösungen können Beispiele sein, bei denen kein Cursoradapter beteiligt ist. Jede Hilfe wird sehr geschätzt, vielen Dank! Bearbeiten Nr. 1: Nach dem Einbeziehen der Änderungen von Phan werden die Status der Kontrollkästchen auf "Falsch" zurückgesetzt, anstatt ihre Status zu behalten, wenn ich durch die Listenansicht scrolle (siehe).

Antworten auf die Frage(6)

Ihre Antwort auf die Frage