Question

Je liste des cases à cocher dans la liste binded par Custom simpleCursorAdapter. Dans mon simpleCursorAdapter personnalisé, j'ai surchargé newView et bindView avec mes modifications. J'ai réussi à me faire MultiChoice. La chose est bizarre, après que je supprime tout élément de ma liste, la case du premier élément est vérifié tout d'un coup. Comment ça se fait? Comment puis-je résoudre?

Ma classe SimpleCursorAdapter:

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()));
            }
        }
    }
}

Voici la partie de code de la classe ListActivity qui décrit le bouton qui supprime les éléments de case cochée:

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);
        }
    }
};
Était-ce utile?

La solution

Je doute que SimpleCursorAdapter est la bonne classe d'étendre ici.

est l'état « checked » connecté au XML de données de quelque façon? Non? Alors vous avez besoin de votre propre adaptateur personnalisé!

En gros tous les adaptateurs doivent mettre en œuvre un moyen de générer une vue d'un élément donné (plus précisément une position d'élément!). Elle sera appelée à tout moment où la liste veut afficher un élément. Maintenant, l'astuce qu'il utilise est de réutiliser qui ne peut pas être vu précédemment créé des éléments d'affichage de la liste à l'écran plus! Ainsi:. Lorsque vous faites défiler la liste vers le bas et un élément disparaît en haut, EXACTEMENT cet objet vue sera réutilisée pour l'élément suivant apparaît

Ainsi, lorsque cette méthode est appelée avec une vue donnée « ancienne » qui devrait être réutilisé, tous contenaient des éléments devront être mis selon les données des éléments. Si une case à cocher fait partie de ce jeu, vous devez avoir un stockage pour l'état vérifié! Il ne suffit pas d'avoir une case à cocher car il y aura moins d'objets de cases à cocher comme il y a des éléments de la liste!

SimpleCursorAdapters sont là - oui - représentent les choses simples. Une des données décrivant XML (images et texte, comme les états de documentation). En raison de cette simplicité tout ce que vous avez à faire ici est de fournir une méthode pour créer de nouveaux objets de vue des éléments - vous n'êtes pas interceptant le processus de réutilisation AT ALL! Il sait au fond que la façon de mettre les données dans un objet vue existante - mais il manque la connaissance de la manière de gérer les boîtes cochée / décochée

Votre solution: écrire votre propre extension BaseAdapter et faire ce qui doit être fait: mettre en œuvre « getView » (et quelques autres méthodes comme getItem, GetItemID et getCount). Il n'est pas difficile du tout! Cette Demo utilise un BaseAdapter et l'état de mExpanded ici est fondamentalement identique à vos états de cases à cocher!

Bonne chance!

Autres conseils

Vous devrez peut-être appeler notifyDataSetChanged lorsque vous modifiez les données.

Le problème est probablement que vous appelez setChecked à partir du onItemClickListener. Une façon hacky autour est de faire ce qui suit avant et après l'appel setChecked à partir de votre auditeur:

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

Ceci empêchera votre onItemClickListener de se faire appelé lorsque vous appelez manuellement setChecked.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top