Android — Как удалить несколько элементов из ListView с помощью флажка?

#android #listview

#Android #listview

Вопрос:

у меня возникает проблема, когда я пытаюсь удалить несколько отмеченных элементов из моего ListView. Если я начинаю удалять снизу вверх, элементы удаляются из моего списка, но возникает проблема, когда я делаю это сверху вниз или если проверяются случайные элементы. Проблема в том, что отмеченные элементы не удаляются, но непроверенные элементы удаляются.

 public class MainActivity extends ActionBarActivity  {
private EditText etn,etl,etd;
private Button add;
private Button rmv;
private ListView listView;
private ArrayList<Data> list;
private MyCustomAdapter dataAdapter = null;

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.menu);
    listView = (ListView) findViewById(R.id.listView1);
    list = new ArrayList<Data>();
             add = (Button) findViewById(R.id.btn_add);
             etn = (EditText) findViewById(R.id.edit_name);
     eta = (EditText) findViewById(R.id.edit_lastname);
     etd = (EditText) findViewById(R.id.edit_document);
     rmv = (Button) findViewById(R.id.btn_delete);

            displayView();



 }














 public class Data {
 long document;
 String name;
 String lastname;
 boolean selected = false;

 public Data(long document, String name, String lastname, boolean selected){
     this.document=document;
     this.name=nom;
     this.lastname=lastname;
     this.selected = selected;
 }

 public String getName(){
     return name;
 }

 public String getLastName(){
     return lastname;
 }

 public long getDocument(){
     return document;
 }

 public boolean isSelected() {
      return selected;
 }

 public void setSelected(boolean selected) {
      this.selected = selected;
     }
}



















public void displayView(){
    String name = etn.getText().toString();
String lastname= eta.getText().toString();
long document = Integer.valueOf(etd.getText().toString());
Data edata = new Data(document,name,lastname,false);
    list.add(edata);
      dataAdapter = new MyCustomAdapter(this,
        R.layout.list_info, list);
      listView.setAdapter(dataAdapter);

}




public void delete(View view){
      deleteListItem();
}



private void deleteListItem(){
 if(list.isEmpty()){
     Toast.makeText(getApplicationContext(),
            "No items to delete.",
            Toast.LENGTH_LONG).show();
     return;
 }
 int itemCount = listView.getCount();
   for(int i=itemCount - 1 ; i>=0; i--){
     Data aux = list.get(i);
     if(aux.isSelected()){
         dataAdapter.remove(aux);
     }
    }
    dataAdapter.notifyDataSetChanged();
}







private class MyCustomAdapter extends ArrayAdapter<Data> {
          private ArrayList<Data> list;

          public MyCustomAdapter(Context context, int textViewResourceId, 
            ArrayList<Data> list) {
           super(context, textViewResourceId, list);
           this.list = new ArrayList<Data>();
           this.list.addAll(list);
          }

          private class ViewHolder {
           TextView name;
           TextView lname;
           TextView doc;
           CheckBox ck;
          }

          @Override
          public View getView(int position, View convertView,   ViewGroupparent) {  

           ViewHolder holder = null;
           if (convertView == null) {
           LayoutInflater vi = (LayoutInflater)getSystemService(
             Context.LAYOUT_INFLATER_SERVICE);
           convertView = vi.inflate(R.layout.list_info, null);
           holder = new ViewHolder();
           holder.name = (TextView) convertView.findViewById(R.id.name);
           holder.ck = (CheckBox) convertView.findViewById(R.id.checkBox1);
           holder.lname = (TextViewconvertView.findViewById(R.id.lastname);
           holder.doc = (TextView)convertView.findViewById(R.id.document);

           convertView.setTag(holder);
           holder.ck.setOnClickListener( new View.OnClickListener() {  
                 public void onClick(View v) {  
                  CheckBox cb = (CheckBox) v ;  
                  Data edata = (Data) cb.getTag();  
                  Toast.makeText(getApplicationContext(),
                   "Checkbox: "   cb.getText()  
                   " is "   cb.isChecked(), 
                   Toast.LENGTH_LONG).show();
                  edata.setSelected(cb.isChecked());
                 }  
                });  

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

           Data aux = list.get(position);
           long document = aux.getDocument();
           holder.doc.setText("Doc:"   Long.toString(document));
           holder.name.setText ("                          "   "Name:"   aux.getName()  "   ");
           holder.lname.setText("Last name:"   aux.getLastName());
           holder.ck.setTag(aux);
           holder.ck.setChecked(aux.isSelected());

           return convertView;

          }
      }
  

Комментарии:

1. проверьте здесь: dj-android.blogspot.in/2013/02 /…

2. хорошо, я посмотрю. Спасибо за ответ.

Ответ №1:

Я думаю, что проблема заключается в этом блоке :

 int itemCount = listView.getCount();
   for(int i=itemCount - 1 ; i>=0; i--){
     Data aux = list.get(i);
     if(aux.isSelected()){
         dataAdapter.remove(aux);
     }
   }
  

Попробуйте так :

 int itemCount = listView.getCount();
   for(int i=itemCount - 1 ; i>=0; i--){
     Data aux = dataAdapter.getItem(i);
     if(aux.isSelected()){
         dataAdapter.remove(aux);
     }
    }
  

Примечание: я не уверен, пожалуйста, попробуйте и дайте мне знать результат.:)

Комментарии:

1. Большое вам спасибо за чтение и ответ. Я получил тот же результат, изменив этот блок.