web-dev-qa-db-fra.com

Android: comment supprimer un élément d'un listView et d'un arrayAdapter

J'ai une collection d'éléments dans un ArrayList. Je les ajoute à un adaptateur client comme suit:

this.m_adapter = new MyAdapter(this, R.layout.myitem,
    itemCart.m_items);

J'ai un bouton de suppression pour chacun de ces éléments dans ma liste, mais je ne sais pas comment connecter la fonction onClick() du bouton de suppression à l'élément d'origine de la liste de tableaux. Quelqu'un peut-il s'il vous plaît expliquer comment faire cela ou me diriger vers un tutoriel où je peux lire à ce sujet? Des réponses non sarcastiques/non condescendantes sont grandement appréciées.

13
gonzobrains

Voici ma solution jusqu'à présent:

Dans la méthode getView() je fais quelque chose comme ceci:

deleteButton.setTag(position);

Il semble que getTag() renvoie un objet. J'ai donc d'abord converti la position int en objet Integer. Cela semble fonctionner. 

Dans OnClickListener(), je fais ce qui suit:

items.remove(index.intValue());

Jusqu'ici tout va bien.

7
gonzobrains

Vous pouvez appeler la méthode remove() sur votre ArrayList

itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();

Ensuite, vous devez appeler notifyDataSetChanged(); sur votre adaptateur pour mettre à jour le logiciel ListView.

26
jcuenod

Vous pouvez obtenir l'index de l'élément simplement en remarquant qu'une vue liste est un ensemble de vues enfants (les lignes de la liste).

Vous pouvez faire quelque chose comme ça dans votre code:

(dans la méthode getView (), par exemple)

row.setOnLongClickListener(new OnLongClickListener() 
{
    @Override
    public boolean onLongClick(View view) {
        remove(listView.indexOfChild(view));
        return true;
    }
}

Autrement dit, la solution consiste simplement à utiliser la méthode indexOfChild (View) pour obtenir l'index de la vue enfant sur laquelle l'utilisateur (long) a appuyé.

6

Après travaille pour moi:

/* Read values from resource into an array */
String[] strColorValues =  getResources().getStringArray(R.array.colors);

ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < strColorValues.length; i++) {
    list.add(strColorValues[i]);
}

ArrayAdapter adapterColors = new ArrayAdapter(getActivity(), Android.R.layout.simple_spinner_item, list);

adapterColors.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

spinnerColors.setAdapter(adapterPermissionLevels);
spinnerColors.setOnItemSelectedListener(this);

/* Remove first element from the adapter and notify dataset changed. */
String item = spinnerColors.getItemAtPosition(0).toString();
adapterColors.remove(item);
adapterColors.notifyDataSetChanged();
3
Amit Garg

Voici mon code.

  transfer.setItemPosition(position, items.get(position).getAddMode());

le transfert ici est l'instance de la classe principale. chaque fois que je clique sur le bouton delete, il passe ensuite la position de cet élément dans la liste de cette ligne.

  public View getView(final int position, View convertView, ViewGroup parent) {
            View v = convertView;
          if (v == null) {
              final Context context = getContext();
                    LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.listviewitem_layout, null);
          }

          ItemEntry item = items.get(position);
          if (item != null) {
                    TextView textViewName = (TextView) v.findViewById(R.id.textViewItemName);
                    ImageView imageViewDelete = (ImageView) v.findViewById(R.id.imageViewDeleteIcon);

                    imageViewDelete.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {                   
                                transfer.showDialog(4);                             
                                transfer.setItemPosition(position, items.get(position).getAddMode());
                        }
                  });

          if (textViewName != null) {
                    textViewName.setText(item.getItemName());
          }

          if(imageViewDelete != null) {
              imageViewDelete.setImageResource(R.drawable.delete);
          }
      }
      return v;
        }
}
1
ロン 産

Supprimer par position:

mainAdapter.remove(mainAdapter.getItem(position));

Comme le dernier:

mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
1
BaiJiFeiLong

Il semble que vous puissiez obtenir l'index (ou la position) d'un élément cliqué dans ListView comme suit:

listview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        listview.remove(listview.getItem(position).toString());
    }
}

Vous devez donc écouter les clics sur les vues, puis extraire l'index.

0
Zelphir

Si vous utilisez le menu contextuel, alors vous pouvez obtenir AdapterContextMenuInfo et cette structure donne l'index et l'id de l'élément cliqué.

0
Dmitriy

Essayez ces codes de lignes cela m'a été très utile

holder.image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            list.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, list.size());
        }
    });
0
Mujahid khan