Frage

Ich habe Liste von Kontrollkästchen in der Liste von Custom simpleCursorAdapter binded. In meinem benutzerdefinierten simpleCursorAdapter habe ich newView und bindView mit meinen Änderungen außer Kraft gesetzt. Ich habe irgendwie multichoice zu tun verwaltet. Die wierd Sache ist, nachdem ich ein Element aus der Liste meiner Liste löschen, das Kontrollkästchen des ersten Punktes wird ganz plötzlich überprüft. Wie kommt das? Wie kann ich es lösen?

Meine SimpleCursorAdapter Klasse:

public class MyListCursorAdapter extends SimpleCursorAdapter
{
    private Context context;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to)
    {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        Cursor c = getCursor();
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);
        CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
        if (chkBoxBtn != null)
        {
            chkBoxBtn.setChecked(false);
        }
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c)
    {
        --binding view to my textsview in my items
        //now it's the importat part:
            CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
    if (chkBoxBtn != null)
    {
        chkBoxBtn.setId(Integer.valueOf(c.getString(c
                .getColumnIndex(MyUsers.User._ID))));
        chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
        chkBoxBtn.setChecked(false);
    }
    }

    //i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
    static ArrayList<String> checkedItemsList = new ArrayList<String>();

    private class OnItemClickListener implements OnClickListener
    {
        private int mPosition;
        private CheckBox chkBox;
        OnItemClickListener(CheckBox mChkBox, View v)
        {
            chkBox = mChkBox;
            chkBox.setChecked(false);
        }

        @Override
        public void onClick(View v)
        {
            if (chkBox.isChecked())
            {
                checkedItemsList.add(String.valueOf(chkBox.getId()));
            }
            else
            {
                checkedItemsList.remove(String.valueOf(chkBox.getId()));
            }
        }
    }
}

Hier ist der Code Teil aus der ListActivity Klasse, die die Schaltfläche beschreibt, dass die überprüften Feldelemente löscht:

OnClickListener btListener = new OnClickListener()
{
    public void onClick(View view)
    {
        // long[] items = listView.getCheckItemIds();
        int x = 0;
        Uri myUri = Uri
        .parse("content://com.idan.datastorageprovider/users");
        String where = "_id" + "=?";
        //here i am tatking all checkboxes which ive added from the  adapter class
        ArrayList<String> checkedItemsList =   MySimpleCursorAdapter.checkedItemsList;
        for (String itemID : checkedItemsList)
        {
            getContentResolver()
            .delete(myUri, where, new String[] { itemID});
            checkedItemsList.remove(itemID);
        }
    }
};
War es hilfreich?

Lösung

Ich bezweifle, dass SimpleCursorAdapter die richtige Klasse ist hier zu verlängern.

Ist der „geprüft“ Zustand in den XML-Daten in irgendeiner Weise verbunden? Nein? So können Sie Ihre eigene kundenspezifische Adapter benötigen!

Grundsätzlich sind alle Adapter haben einen Weg zu implementieren, eine Ansicht von einem bestimmten Element zu erzeugen (genauer: ein Element Position!). Dies wird jederzeit aufgerufen werden, wo die Liste will ein Element angezeigt werden soll. Jetzt verwendet der Trick ist es wieder zu verwenden frühe Listenansicht Elemente erstellt, die nicht auf dem Bildschirm mehr jeder sehen können! Also:. Beim Blättern der Liste nach unten, und ein Element verschwindet an der Spitze, genau diese Ansicht Objekt wird für den nächsten erscheinenden Artikel wiederverwendet wird

Also, wenn diese Methode mit einer bestimmten „alten“ Ansicht aufgerufen wird, die wiederverwendet werden soll, wird alle enthaltenen Elemente gesetzt werden müssen, um die Elemente Daten entsprechend. Wenn ein Kontrollkästchen Teil dieses Spiels ist, werden Sie einen Speicher für den Überprüfungsstatus haben müssen! Es ist nicht ausreichend, um eine Checkbox zu haben, da es weniger Kontrollkästchen Objekte sein, da es Listenelemente sind!

SimpleCursorAdapters gibt es zu - ja - einfache Dinge darstellen. Eine XML beschreibt Daten (Bilder und Text, wie die Dokumentation Staaten). Aufgrund dieser Einfachheit alle müssen Sie hier zu tun ist, ein Verfahren bereitzustellen, um neues Element Ansicht Objekte zu erstellen - Sie können nicht für die Weiterverwendung Prozess AT ALL sind Abfangen! Es besteht im Wesentlichen nur weiß, wie die Daten in eine bestehende Ansicht Objekt zu setzen - aber es fehlt das Wissen, wie aktiviert / deaktiviert Boxen Griff

Ihre Lösung: Schreiben Sie Ihre eigene BaseAdapter Erweiterung und tun, was getan werden muss: implementieren „getView“ (und einige andere Methoden wie getItem, GetItemID und getCount). Es ist nicht schwer, überhaupt! Diese API Demo verwendet hier ein BaseAdapter und der mExpanded Zustand Ihrer Checkbox Staaten grundsätzlich identisch ist!

Viel Glück!

Andere Tipps

Sie können anrufen müssen notifyDataSetChanged wenn Sie die Daten ändern.

Das Problem ist wahrscheinlich, dass Sie aus dem onItemClickListener setChecked sind aufgerufen wird. Ein hacky Weg, um dies ist die folgenden zu tun, bevor und nachdem Sie aus Ihrem Zuhörer setChecked Anruf:

chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);

Dies wird verhindern, dass Ihre onItemClickListener aus aufgerufen wird, wenn Sie manuell setChecked nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top