0

Je sais qu'il y a beaucoup de questions liées à ListView personnalisé avec CheckBox, mais j'ai toujours des problèmes pour récupérer tous les éléments cochés.ListView personnalisé avec CheckBox

Ce que je fais est:

Affichage personnalisé ListView la base de données (Liste de tous les SMS envoyés).

Permet à l'utilisateur de vérifier divers éléments de la liste.

Lorsque l'utilisateur appuie sur le bouton Supprimer je veux supprimer tous les éléments sélectionnés (A partir de la base de données ainsi que la partie de vue)

Problème: Quand je vais à mon activité pour la première fois et le contrôle certains éléments, et le supprimer, ça fonctionne bien.

Mais quand je vérifie à nouveau quelques articles juste après avoir appuyé sur le bouton de suppression, certains articles est vérifié et certains devient sans contrôle et encore quelques autres éléments sont supprimés ..

Je pense que je ne suis pas capable de se lier article id et la liste parfaitement ..

codage fait jusqu'à présent:

row.xml contient

ImageView 
TextView 
TextView 
TextView 
CheckBox 

Dans ma classe d'activité:

Uri uriSms = Uri.parse("content://sms/sent"); 
Cursor cursor = context.getContentResolver().query(uriSms, null,null,null,null); 
String[] from={"address","body"}; 
int[] to={R.id.contactName,R.id.msgLine}; 
ssa=new SentSmsAdapter(context,R.layout.inbox_list_item,cursor,from,to,2); 
smsList.setAdapter(ssa); 

deleteSms.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 

       ArrayList<Boolean> list=SentSmsAdapter.itemChecked; 

       Uri path=Uri.parse("content://sms/"); 
       for(int i=0;i<list.size();i++) 
       { 
        if(list.get(i)) 
         getContentResolver().delete(path,"_id="+ssa.getItemId(i),null); 
       } 

       ssa.notifyDataSetChanged(); 
} 

J'ai SimpleCursorAdapter personnalisé.

public class SentSmsAdapter extends SimpleCursorAdapter{ 

    Cursor dataCursor; 
    LayoutInflater mInflater; 
    Context context; 
    int layoutType; 
    ArrayList<String> arrayList; 
    public static HashMap<String,Long> myList=new HashMap<String,Long>(); 

    public static ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 
    public static ArrayList<Long> itemIds=new ArrayList<Long>(); 

    public SentSmsAdapter(Context context, int layout, Cursor dataCursor, String[] from, 
        int[] to,int type) { 
      super(context, layout, dataCursor, from, to); 


      layoutType=type; 
      this.context=context; 
      this.dataCursor = dataCursor; 
    mInflater = LayoutInflater.from(context); 

    arrayList=new ArrayList<String>(); 

    for (int i = 0; i < this.getCount(); i++) { 
     itemChecked.add(i, false); 
    } 

    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

      final ViewHolder holder; 

      if(convertView==null) 
      { 
        convertView = mInflater.inflate(R.layout.inbox_list_item, null); 
      holder = new ViewHolder(); 

      holder.checkBox=(CheckBox) convertView.findViewById(R.id.checkMsg); 
      holder.checkBox.setTag(position); 
      holder.cName=(TextView)convertView.findViewById(R.id.contactName); 
      holder.icon=(ImageView)convertView.findViewById(R.id.msgImage); 
      holder.msg=(TextView)convertView.findViewById(R.id.msgLine); 
      holder.time=(TextView)convertView.findViewById(R.id.msgTime); 



      convertView.setTag(holder); 
      holder.checkBox.setTag(itemChecked.get(position)); 
      } 
      else 
      { 
        holder=(ViewHolder)convertView.getTag(); 
      } 

       holder.checkBox.setOnClickListener(new OnClickListener(){ 


            @Override 
            public void onClick(View view) { 
              // TODO Auto-generated method stub 
              CheckBox cb = (CheckBox) view.findViewById(R.id.checkMsg); 
              int pos=Integer.parseInt(holder.checkBox.getTag()); 

            itemChecked.set(position, cb.isChecked()); 

              /*if (cb.isChecked()) { 
            itemChecked.set(position, true); 

            Log.i("WhenChecked",Boolean.toString(itemChecked.get(position))); 
            // do some operations here 
           } 
              else if (!cb.isChecked()) { 
            itemChecked.set(position, false); 
            Log.i("WhenNotChecked",Boolean.toString(itemChecked.get(position))); 
            // do some operations here 
           } 
            */ 

            } 
          }); 

      dataCursor.moveToPosition(position); 

      String id=Integer.toString(dataCursor.getInt(dataCursor.getColumnIndexOrThrow("_id"))); 
      itemIds.add(Long.parseLong(id)); 

      String msgText=dataCursor.getString(dataCursor.getColumnIndexOrThrow("body")); 
      holder.msg.setText(msgText); 

      Long time=dataCursor.getLong(dataCursor.getColumnIndexOrThrow("date")); 
      holder.time.setText(Long.toString(time)); 

      String address=dataCursor.getString(dataCursor.getColumnIndexOrThrow("address")); 

      Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));   
      Cursor cs= context.getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},null,null,null); 

      if(cs.getCount()>0) 
        address=cs.getString(cs.getColumnIndex(PhoneLookup.DISPLAY_NAME)); 

      cs.close(); 
      holder.cName.setText(address); 


      if(layoutType==1)holder.checkBox.setVisibility(View.GONE); 
      else 
      { 
        holder.checkBox.setVisibility(View.VISIBLE); 
      } 
      arrayList.add(id+","+address+","+msgText+","+Long.toString(time)); 
      return convertView; 
    } 

    static class ViewHolder 
    { 
      ImageView icon; 
      CheckBox checkBox; 
      TextView cName; 
      TextView msg; 
      TextView time; 
    } 

    @Override 
    public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return arrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return itemIds.get(position); 
    } 

}

Répondre

4

Essayez quelque chose comme ceci.

ajouter ce code dans getView()

holder.checkBox.seTag(position); 
holder.checkBox.setOnCheckedChangedListener(this); 

mettre en œuvre ce en dehors getView(). Lors de la suppression, supprimez tous les éléments de la liste dont l'index est disponible dans itemChecked. Lors de la suppression, supprimez tous les éléments de la liste dont l'index est disponible dans itemChecked.

Merci et N-JOY.

+0

J'ai une classe similaire à celle de Kartik, mais j'utilise un ArrayAdapter. Lorsque l'un des checkBoxes est cliqué, l'événement onCheckChanged est appelé pour chacun d'eux. Le fait que j'utilise un ArrayAdapter ne devrait pas changer cela? –

+1

J'ai utilisé onClick au lieu de onCheckedChanged comme je l'ai lu ici (http://stackoverflow.com/questions/5438375/custom-listview-with-checkbox-problem) et j'ai réussi à le faire fonctionner. –

0

Si vous utilisez des fils lors de la vérification, décochant et supprimer vos articles, ils fonctionnent correctement.