4 votes

Comment supprimer des cases à cocher de la liste ?

J'ai 50 éléments dans la liste. Maintenant, j'ai coché 10 éléments, alors comment faire pour que ces 10 éléments cochés soient supprimés de la liste lorsque je clique sur le bouton de suppression.

Voici mon code

Veuillez voir mon code et la réponse où se trouve l'erreur. :

public class BookmarksJokes extends Activity implements OnClickListener,
    OnItemClickListener {
ListView lv;
Button btn_delete;
public String TAG = "horror";
private SQLiteDatabase db;
public static final String PREFS_NAME = "MyPreferences";
static String[] tempTitle = new String[100];
static String[] tempBody = new String[100];
private static boolean bRequiresResponse;

private static class EfficientAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public EfficientAdapter(Context context) {
        mInflater = LayoutInflater.from(context);

    }
    public int getCount() {
        return tempTitle.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.bookmarks_list_item,
                    null);
            holder = new ViewHolder();
            holder.text1 = (TextView) convertView
                    .findViewById(R.id.title);
            holder.text2 = (TextView) convertView
                    .findViewById(R.id.body);
             holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);

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

        holder.text1.setText(tempTitle[position]);
        holder.text2.setText(tempBody[position]);
        // bRequiresResponse = checkBox.isChecked();
        return convertView;
    }

    static class ViewHolder {
        TextView text1;
        TextView text2;
        CheckBox checkBox;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.bokmarksjoks);

    try {
        db = (new DatabaseHelper(this)).getWritableDatabase();
    } catch (IOException e) {
        e.printStackTrace();
    }
    setUpViews();

    title = (TextView) findViewById(R.id.body);
    SharedPreferences pref = getSharedPreferences(PREFS_NAME, 0);

    //String ids = pref.getString("jid", "");
    String one = pref.getString("title", "");
    String two = pref.getString("body", "");

    tempTitle = one.split(",");
    tempBody = two.split(",");
    lv.setAdapter(new EfficientAdapter(this));
}

private void setUpViews() {
    lv = (ListView) findViewById(R.id.list);
    btn_delete = (Button) findViewById(R.id.delete);
    btn_delete.setOnClickListener(this);
    // checkbox = (CheckBox) findViewById(R.id.checkbox);

}
private void removeData(){
//int pos= getIntent().getIntExtra("POSITION", 0);
//lv.removeViewAt(pos);
// notifyAll();*/
//  int pos= getIntent().getIntExtra("POSITION", 0);
//  if(checkBox.isChecked()){
//      Log.d(TAG, " checked d]"+pos);
//      Toast.makeText(this, "checked "+pos, Toast.LENGTH_SHORT).show();
//  }
}
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.delete:
        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        alt_bld.setMessage("Are you Sure want to delete all checked jok ?")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                //removeJok();

                            }
                        })
                .setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                dialog.cancel();
                            }
                        });
        AlertDialog alert = alt_bld.create();
        alert.setTitle("Delete Jokes");
        alert.show();
    case R.id.checkbox:

    default:
        break;
    }

}

public void onItemClick(AdapterView<?> arg0, View view, int position,
        long ids) {

    try {

    //   checkBox = (CheckBox)view.findViewById(R.id.checkbox);
    //   checkBox.setChecked(true);

        Intent intent = new Intent(BookmarksJokes.this,
                BookmarkJokesDetails.class);

        intent.putExtra("POSITION", position);
        intent.putExtra("ID", ids);
        Cursor cursor = (Cursor) adapter.getItem(position);

        intent.putExtra("_ID",
                cursor.getInt(cursor.getColumnIndex("_id")));

        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Toast.makeText(BookmarksJokes.this,
            "Item in position " + position + " clicked", Toast.LENGTH_LONG)
            .show();
}
}

Voici mon code complet :

http://pastebin.com/LB2WKHMP

10voto

Dinesh Sharma Points 7098

J'ai effectué la même tâche dans l'une de mes applications.

Ce qu'il faut faire, c'est utiliser un Liste de tableaux ayant la même taille que l'élément de la liste et chaque élément contient 0 par défaut. Maintenant, dans votre adaptateur efficace, pour chaque case cochée, attribuez 1 à cette position particulière dans arrayList. Enfin, lorsque l'on clique sur le bouton de suppression, on parcourt la liste de tableaux et l'on supprime tous les éléments de la liste qui contiennent 1 à cette position dans la liste de tableaux et, en dernier lieu, on appelle Méthode notifyDatasetChanged() de la liste pour que la liste soit actualisée et affiche la nouvelle liste.

Voici un exemple de code pour vous donner une meilleure idée de la situation :

 ArrayList<Integer> checks=new ArrayList<Integer>();

Maintenant, dans la méthode onCreate

for(int b=0;b<tempTitle.length;b++){
    checks.add(b,0);  //assign 0 by default in each position of ArrayList
        } 

Maintenant, dans la méthode getView de votre efficientAdapter

 public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.bookmarks_list_item,
                    null);
            holder = new ViewHolder();
            holder.text1 = (TextView) convertView
                    .findViewById(R.id.title);
            holder.text2 = (TextView) convertView
                    .findViewById(R.id.body);
             holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);

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

           holder.checkBox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                if(((CheckBox)v).isChecked()){
                  checks.set(position, 1);
                }
                else{
                 checks.set(position, 0);
                }

            }
        });

        return convertView;
    }

Enfin, sur le bouton de suppression, cliquez sur :

     delete.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
    // TODO Auto-generated method stub

          for(int i=0;i<checks.size();i++){

    if(checks.get(i)==1){
          //remove items from the list here for example from ArryList 
          checks.remove(i);
           //similarly remove other items from the list from that particular postion
           i--;
        }
     }
    ((EfficientAdapter)lv.getAdapter()).notifyDataSetChanged();
  }
}

J'espère que cela résoudra votre problème.

4voto

Richa Points 2034

Je suppose que j'ai obtenu des identifiants qui sont sélectionnés. maintenant simplement arrayList.remove(position) ; et appeler notifyDataSetChanged() ;

2voto

a fair player Points 2514

Votre code ne contient pas la relation entre la case à cocher et l'objet et vous n'avez pas non plus implémenté la fonction onCheckedchangeListener à l'intérieur de votre adaptateur .... voici ce dont vous avez besoin http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive Ou Je l'emballerai pour vous :

  1. vous devrez créer une classe model.java qui représente la cellule de la liste comme suit :

    public class Model {
         private String title;
         private String body;
         private boolean isSelected;
    
         public Model(String title, String body) {
              this.title = title;
              this.body = body;
              this.isSelected = false;
         }
    
         // here you MUST create your set of setters and getters.
    }
  2. modifier votre adaptateur pour l'étendre ArrayAdapter<Model>

  3. modifier le constructeur de l'adaptateur pour qu'il soit

    private Model[] model;
    public EfficientAdapter(Context context, Model model) {
    
         mInflater = LayoutInflater.from(context);
         this.model = model;
    
    }
  4. vous devrez alors ajouter l'élément onCheckedChangeListener à l'intérieur de votre adaptateur à l'intérieur du getView de sorte que votre getView se présentera comme suit :

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
    
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.text1 = (TextView) convertView.findViewById(R.id.title);
            viewHolder.text2 = (TextView) convertView.findViewById(R.id.body);
            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
            viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
                @Override
                public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    
                    Model element = (Model) viewHolder.checkbox.getTag();
    
                    element.setSelected(buttonView.isChecked());
                }
            });
            view.setTag(viewHolder);
            viewHolder.checkbox.setTag(list[position]);
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).checkbox.setTag(list[position]);
        }
    
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text1.setText(tempTitle[position]);
        holder.text2.setText(tempBody[position]);
        return view;
    }
  5. puis créez le tableau de modèles dans votre activité et passez-le à l'adaptateur.

  6. la dernière chose à faire est de supprimer les éléments sélectionnés de la liste :

    final ArrayList<Model> newModel = new ArrayList<Model>();
    
    for (int i = 0; i < model.length/*this is the original model*/; i++) {
    
        if(model[i].isChecked()){
    
            // fill the array list ...
            newModel.add(model[i]);
        }
    }
  7. c'est tout, passez le newModel à l'adaptateur et restaurez l'adaptateur dans la liste.

L'étape 7 peut également être réalisée en remplissant le modèle (le modèle original qui est passé à l'origine au tableau) et en appelant ensuite notifyDataSetChanged() en utilisant l'adaptateur.

C'est tout et c'est ce qui a toujours fonctionné pour moi... J'espère que cela vous aidera aussi.

0voto

varesa Points 1366

Si vous utilisez un listview avec le mode CHOICE_MODE_MULTIPLE, vous devriez pouvoir utiliser quelque chose comme : listView.getCheckedItemPositions() ;

Si les éléments de la liste sont stockés dans une sorte de liste ou de vecteur, vous devriez être en mesure de supprimer facilement les éléments ayant la même position et de mettre à jour la vue de la liste.

Bien que toutes mes connaissances en matière de cases à cocher et de listes soient basées sur cette méthode : Liste Android et case à cocher

0voto

Sameer Points 6735

Je pense que votre problème ne nécessite pas une grande quantité de code. Vous avez juste besoin d'un concept. La réponse donnée ci-dessus est la meilleure façon de le faire.

I am assuming i got ids which are selected. now simply arrayList.remove(position);
and call notifyDataSetChanged();

Comme le sous enfant de la vue Liste (CheckBox) peut utiliser setOnCheckChangesListener dans la classe de l'adaptateur de base, il suffit de garder une trace des cases à cocher et de leur position correspondante dans la liste ArrayList, et lorsque vous cliquez sur le bouton de suppression, vous supprimez l'élément de la liste ArrayList et appelez notifyDataSetChanged().

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