2011-01-15 1 views
11

Ho una raccolta di elementi in un ArrayList. Io li aggiungo a un adattatore cliente come segue:Android: come rimuovere un elemento da un listView e arrayAdapter

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

Ho un pulsante Elimina per ciascuno di questi elementi nella mia lista, ma non sono sicuro di come collegare il onClick() tasto di cancellazione con la voce originale nel ArrayList . Qualcuno può spiegare come farlo o indicarmi un tutorial in cui posso leggere su questo? Le risposte non sarcastiche/non condiscendenti sono molto apprezzate.

risposta

7

Ecco la mia soluzione finora:

Nel Metodo getView() faccio qualcosa del genere:

deleteButton.setTag(position); 

Sembra che getTag() restituisca un oggetto. Quindi ho prima convertito la posizione int in un oggetto intero. Sembra che funzioni.

Nel OnClickListener() faccio la seguente:

items.remove(index.intValue()); 

Fin qui, tutto bene.

+0

Quindi, senza i tag, non hai idea del pulsante su cui è stato fatto clic? Mi sembra che tu abbia trascurato qualche meccanismo per capirlo. Pensa all'utilizzo del genitore del pulsante. – jcuenod

25

È possibile chiamare il metodo remove() sul ArrayList

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

E poi è necessario chiamare notifyDataSetChanged(); sulla scheda per aggiornare il ListView

+0

Sì, ma il mio problema è capire come specificare l'indice per questo articolo? Penso di aver bisogno di usare setTag() originariamente poi getTag() prima della rimozione, ma mi piacerebbe vedere qualche codice di esempio, se possibile. Grazie ancora. – gonzobrains

+0

Ho un menu di scelta rapida su ListView con un pulsante di eliminazione che consente all'elemento di utilizzare ciò che è essenzialmente 'item.getMenuInfo(). Id' (non è così semplice). Sicuramente i tuoi pulsanti hanno indici. – jcuenod

0

Se si utilizza il menu di scelta rapida, è possibile ottenere AdapterContextMenuInfo e questa struttura fornisce l'indice e l'id dell'elemento selezionato.

+2

ma non l'ID del database. – Mikey

5

È possibile ottenere l'indice dell'elemento semplicemente notato che una vista elenco è una raccolta di viste secondarie (le righe dell'elenco).

si può fare qualcosa di simile nel codice:

(all'interno del metodo GetView(), per esempio)

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

Cioè, la soluzione è sufficiente utilizzare il metodo indexOfChild (Visualizza) per ottenere l'indice della vista figlio che l'utente (lungo) ha premuto.

1

Ecco il mio codice.

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

il trasferimento qui è l'istanza della classe principale. ogni volta che faccio clic sul pulsante delete, quindi passa la posizione di quell'elemento nell'elenco in questa riga.

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; 
     } 
} 
3

In seguito lavora per me:

/* 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(); 
0

Sembra che si può ottenere l'indice (o la posizione) di un elemento cliccato nel ListView come segue:

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

Così si bisogno di ascoltare per i clic su Views e quindi prendere l'indice da quello.

0

Rimuovere in base alla posizione:

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

Come ad esempio l'ultimo:

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