2017-10-06 12 views
0

Bonjour,ListView n'est pas rafraîchissant des valeurs après la suppression de la ligne avec la valeur de case = true

Je fais un listview, baseadapter avec case à cocher qui est capable de supprimer plusieurs lignes sélectionnées.

voici mon onCreate:

ArrayList<Memos> list; 

list = new ArrayList<Memos>(); 
list.add(new Memos(1, "s", "s")); 
list.add(new Memos(2, "x", "aaa")); 
list.add(new Memos(3, "v", "aesf")); 

final ListView lv = (ListView) findViewById(R.id.myList); 
lv.setAdapter(new MemoListAdapter(list, this)); 

deletebutton 
@Override 
     public void onClick(View v) { 
      MemoListAdapter myAdapter = (MemoListAdapter)lv.getAdapter(); 
      myAdapter.remove(); 
     } 

alors voici ma baseadapter complète:

 public class MemoListAdapter extends BaseAdapter { 
    private List<Memos> listComment; 
    private Context context; 
    private LayoutInflater inflater = null; 
    private ArrayList<Memos> deleteMemos; 

    public MemoListAdapter(List<Memos> listComment, Context context) { 
     super(); 
     this.listComment = listComment; 
     this.context = context; 
     inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     deleteMemos = new ArrayList<Memos>(); 
    } 

    @Override 
    public int getCount() { 

     return listComment.size(); 
    } 

    @Override 
    public Memos getItem(int position) { 
     return listComment.get(position); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 

    @Override 
    public int getViewTypeCount() { 

    return getCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

    return position; 
    } 

    public class ViewHolder 
    { 
     TextView body; 
     TextView date; 
     CheckBox checkBox; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_view, null); 
      holder = new ViewHolder(); 
      holder.body = (TextView) convertView.findViewById(R.id.big_text); 
      holder.date = (TextView) convertView.findViewById(R.id.small_text); 
      holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 
      holder.body.setText(listComment.get(position).getMessageBody()); 
      holder.date.setText(listComment.get(position).getMessageDate()); 

      holder.checkBox.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
          //is chkIos checked? 
        if(listComment.get(position).isCheckbox()) { 
        holder.checkBox.setChecked(false); 
        deleteMemos.remove(listComment.get(position)); 
        } 
        else { 
         // Do invisible or gone stuff here 
        holder.checkBox.setChecked(true); 
        deleteMemos.add(listComment.get(position)); 
        } 

       } 
       }); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     return convertView; 
    } 

    public void remove() { 

     for(Memos memo : deleteMemos) { 
      listComment.remove(memo); 
     } 
     this.notifyDataSetChanged(); 
    } 
    } 

après avoir sélectionné les lignes à supprimer (4 lignes)

enter image description here

la liste ajusté mais le contenu et la valeur de contrôle de la case à cocher i s toujours le même.

enter image description here

Je me demande quelle partie du notifyDataSetChanged est faux. Merci d'avance!

+0

Déplacez votre 'this.notifyDataSetChanged()' 'ci-dessous listComment.remove (mémo)', à l'intérieur de la boucle. – Stanojkovic

+0

@Stanojkovic, malheureusement, il ne fonctionne toujours pas :( –

Répondre

1

Vos vues sont réutilisées, c'est pourquoi cela se produit. Essayez d'ajouter ci-dessous dans votre code getView()

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_view, null); 
      holder = new ViewHolder(); 
      holder.body = (TextView) convertView.findViewById(R.id.big_text); 
      holder.date = (TextView) convertView.findViewById(R.id.small_text); 
      holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     if(listComment.get(position).isCheckbox()) { 
      holder.checkBox.setChecked(true); 
     }else { 
      holder.checkBox.setChecked(false); 
     } 

     holder.body.setText(listComment.get(position).getMessageBody()); 


     holder.date.setText(listComment.get(position).getMessageDate()); 
     holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
       listComment.get(position).setIsCheckbox(isChecked); 
       if (isChecked){ 
        deleteMemos.add(listComment.get(position)); 
       }else{ 
        deleteMemos.remove(listComment.get(position)); 
       } 
      } 

     }); 

     return convertView; 
    } 
+0

malheureusement, cela ne fonctionne pas :( la case à cocher réinitialiser ... mais la listrow seulement ajuster et ne supprime pas l'élément correct qui est supprimé. ( –

+0

J'ai édité ma réponse.) S'il vous plaît utiliser ce –

+0

ouais, Il fonctionne maintenant parfaitement! merci très MUCH! –