2011-01-15 17 views
11

Ich habe eine Sammlung von Elementen in einer ArrayList. Ich füge sie zu einem Kunden-Adapter wie folgt:Android: wie man ein Element aus einer ListView und ArrayAdapter

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

ich eine Löschtaste für jedes dieser Elemente in meiner Liste, aber ich bin nicht sicher, wie die Schaltfläche Löschen des in der Arraylist onClick() mit dem ursprünglichen Artikel verbinden . Kann jemand bitte erklären, wie man das macht oder auf ein Tutorial hinweist, wo ich das nachlesen kann? Nicht sarkastische/nicht herablassende Antworten werden sehr geschätzt.

Antwort

7

Hier ist meine Lösung so weit zu aktualisieren:

In der getView() Methode Ich mache so etwas:

deleteButton.setTag(position); 

Es sieht so aus, als ob getTag() ein Objekt zurückgibt. Also habe ich zuerst die Position int in ein Integer-Objekt umgewandelt. Es scheint zu funktionieren.

Im OnClickListener() ich folgendes tun:

items.remove(index.intValue()); 

So weit, so gut.

+0

Also ohne die Tags - Sie haben keine Ahnung, auf welche Schaltfläche geklickt wird? Es scheint mir, dass Sie einen Mechanismus übersehen haben, um das herauszufinden. Denken Sie darüber nach, die Eltern der Schaltfläche zu verwenden. – jcuenod

25

können Sie rufen die remove() Methode auf ArrayList

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

Und dann müssen Sie notifyDataSetChanged(); auf Ihrem Adapter rufen Sie die Listview

+0

Ja, aber mein Problem ist, herauszufinden, wie für das Element den Index angeben? Ich denke, ich muss SetTag() ursprünglich dann getTag() vor der Entfernung verwenden, aber ich möchte, wenn möglich, einige Beispielcode sehen. Danke noch einmal. – gonzobrains

+0

Ich habe ein Kontextmenü auf einer ListView mit einer Schaltfläche zum Löschen, die ich das Element aus, was im Wesentlichen 'item.getMenuInfo(). ID' (es ist nicht so einfach). Sicher haben Ihre Tasten jedoch Indizes. – jcuenod

0

Wenn Sie das Kontextmenü verwenden, können Sie AdapterContextMenuInfo abrufen, und diese Struktur gibt den Index und die ID des angeklickten Elements an.

+2

, aber nicht die Datenbank-ID. – Mikey

5

Sie können den Index des Elements abrufen, indem Sie einfach beachten, dass eine Listenansicht eine Sammlung von untergeordneten Ansichten (die Zeilen der Liste) ist.

Sie können in Ihrem Code so etwas tun:

(im getView() Methode, zum Beispiel)

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

Das heißt, ist die Lösung einfach zu indexOfChild (View) Methode Index der Kindansicht erhalten, die der Benutzer (lang) gedrückt hat.

1

Hier ist mein Code.

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

Die Übertragung hier ist die Instanz der Hauptklasse. Jedes Mal, wenn ich auf die Schaltfläche Löschen klicke, übergibt es die Position des betreffenden Elements in der Liste in dieser Zeile.

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

Folgende Arbeiten für mich:

/* 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

Es scheint, dass Sie den Index (oder Position) erhalten kann aus einem geklickt Element in der Listview wie folgt:

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

Sie also Sie müssen auf Klicks auf Ansichten achten und dann den Index daraus nehmen.

0

Entfernen von Position:

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

Wie die zuletzt:

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