2 votes

Renvoyer l'état coché de la case à cocher dans Android

Duplicata possible :
Android enregistre l'état de la case à cocher dans le ListView avec l'adaptateur de curseur

J'ai un ListView où chaque élément contient un certain text(name,id) et une case à cocher. Il y a un bouton pour revenir en arrière à partir de ListView page. Ainsi, un utilisateur vérifie certains éléments et retourne à la page précédente. Il y a également un bouton sur cette page pour revenir à la page précédente. ListView page. Lorsqu'il/elle revient, je veux lui montrer les éléments qu'il/elle a sélectionnés précédemment.

Je suis au courant SharedPreferences mais je ne veux pas l'utiliser car je ne veux pas sauvegarder cet état lorsque l'utilisateur redémarre l'application. Je ne le veux que pendant l'exécution de l'application. Je fais un certain travail dessus, je sauvegarde les données qu'il a sélectionnées et je les vérifie également lorsqu'il revient. Mais je n'arrive pas à vérifier les cases à cocher. J'espère que quelqu'un pourra me dire ce que je fais de mal ici. J'utilise les cases à cocher à partir de xml, pas de manière programmatique.

public class MyCustomArrayAdapter extends ArrayAdapter<Model> {

    private final List<Model> list;

    private final  Activity context;

    public static ArrayList<String> friendName=new ArrayList<String>();
    public static ArrayList<String> friendBirthdate=new ArrayList<String>();
    public static ArrayList<String> friendId=new ArrayList<String>();
    public static ArrayList<String> getSelectedFriendId;
    public MyCustomArrayAdapter(Activity context, List<Model> list) 
    {
        super(context, R.layout.list_layout, list);

        this.context = context;
        this.list =  list ;
    }

    public static int count=0;
    static class ViewHolder 
    {
        protected TextView text, sub;
        protected CheckBox checkbox;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View view = null;

        if (convertView ==null)
        {
            LayoutInflater inflator = context.getLayoutInflater();

            view = inflator.inflate(R.layout.list_layout, null);

            final ViewHolder viewHolder = new ViewHolder();

            viewHolder.text = (TextView)view.findViewById(R.id.label);

            viewHolder.text.setTextColor(Color.WHITE);

            viewHolder.sub = (TextView)view.findViewById(R.id.sub);

            viewHolder.sub.setTextColor(Color.GRAY);

            viewHolder.checkbox = (CheckBox)view.findViewById(R.id.check);

            if(SelectionPage.get_selectedFriendId()!=null)   //checking whether user checked something earlier
            {
                getSelectedFriendId=SelectionPage.get_selectedFriendId();   //get checked userid from when user selects something

                for( int x = 0 ; x < getSelectedFriendId.size() ; x++ )
                {
                    for(int a=0;a<list.size();a++)
                    {
                        if(list.get(a).getId().contains(getSelectedFriendId.get(x)))
                        {
                            Toast.makeText( context, "matched..", Toast.LENGTH_SHORT).show();
                            viewHolder.checkbox.setChecked(true); //this doesn't check checkbox which is the problem!
                        }
                    }
                }
            }
            viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
            {
                public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
                {
                    Model element = (Model)viewHolder.checkbox.getTag();

                    if(buttonView.isChecked())
                    {
                        count++;

                        friendName.add(element.getName().toString());
                        friendBirthdate.add(element.getPlace().toString());
                        friendId.add(element.getId().toString());
                    }
                    else
                    {
                        friendName.remove(element.getName().toString());
                        friendBirthdate.remove(element.getPlace().toString());
                        friendId.remove(element.getId().toString());
                        count--;
                    }
                }
            });

            view.setTag(viewHolder);
            viewHolder.checkbox.setTag(list.get(position));

        } 
        else 
        {
            view = convertView;
            ((ViewHolder)view.getTag()).checkbox.setTag(list.get(position));
        }

        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(list.get(position).getName());
        holder.sub.setText( list.get(position).getPlace());
        return view;
    }
}

1voto

Joe Plante Points 2733

Est-ce que vous lancez du code pour rafraîchir le listview après que le contenu d'une vue ait changé ? Vous devez parfois le faire, sinon une ListView fait on ne sait quoi. Il y a un tas de commandes comme invalidateViews() qui peuvent faire cela. Le fait que la vue dans getView s'invalide elle-même peut également fonctionner.

Le code pourrait certainement être optimisé, mais c'est un autre sujet.

1voto

ridoy Points 2612

Merci à tous d'avoir répondu. J'ai obtenu la réponse moi-même après 2 heures de jeu. J'ai apporté quelques changements dans la vérification de l'élément qui a été sélectionné précédemment. Donnez mon code mis à jour ci-dessous pour ceux qui font face au même problème que moi.

    if(SelectionPage.get_selectedFriendId()!=null)
    {
        String s=list.get(position).getId().toString();

        getSelectedFriendId=SelectionPage.get_selectedFriendId();

        for( int x = 0 ; x < getSelectedFriendId.size() ; x++ )
        {
            if(s.contains(getSelectedFriendId.get(x)))
            {
                Toast.makeText( context, "matched!..", Toast.LENGTH_SHORT).show();
                holder.checkbox.setChecked(true);

            }
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X