2011-01-15 14 views
11

Mam kolekcję przedmiotów w tablicy ArrayList. I dodać je do karty klienta w następujący sposób:Android: jak usunąć element z listy Widok i tablicaAdapter

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

Mam przycisk Usuń dla każdego z tych elementów w moim liście, ale nie jestem pewien jak podłączyć przycisk Usuń na onClick() z oryginalnego elementu w ArrayList . Czy ktoś może wyjaśnić, jak to zrobić, lub wskazać mi samouczek, w którym mogę to przeczytać? Odpowiedzi nie sarkastyczne/nie-łaskawe są bardzo doceniane.

Odpowiedz

7

Oto moje rozwiązanie do tej pory:

W getView() metoda Wykonuję coś takiego:

deleteButton.setTag(position); 

Wygląda na to, że getTag() zwraca obiekt. Więc najpierw przekonwertowałem pozycję int na obiekt Integer. Wygląda na to, że działa.

W OnClickListener() I wykonaj następujące czynności:

items.remove(index.intValue()); 

Tak daleko, tak dobrze.

+0

Więc bez tagów - nie masz pojęcia, który przycisk jest kliknięty? Wydaje mi się, że przeoczyłeś jakiś mechanizm wymyślania tego. Pomyśl o użyciu rodzica przycisku. – jcuenod

25

można wywołać metodę remove() na ArrayList

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

A potem trzeba zadzwonić notifyDataSetChanged(); na karty zaktualizować ListView

+0

Tak, ale mój problem jest dowiedzieć się, jak określić indeks dla tego elementu? Myślę, że potrzebuję użyć setTag() pierwotnie wtedy getTag() przed usunięciem, ale chciałbym zobaczyć przykładowy kod, jeśli to możliwe. Dzięki jeszcze raz. – gonzobrains

+0

Mam menu kontekstowe na ListView za pomocą przycisku usuwania, że ​​otrzymuję element z wykorzystaniem, co zasadniczo 'item.getMenuInfo(). Id' (to nie jest takie proste). Z pewnością twoje przyciski mają indeksy. – jcuenod

0

Jeśli używasz menu kontekstowego, możesz uzyskać AdapterContextMenuInfo i ta struktura daje indeks i identyfikator klikniętego elementu.

+2

, ale nie identyfikator bazy danych. – Mikey

5

Możesz uzyskać indeks elementu, po prostu zauważyłeś, że widok listy jest zbiorem widoków podrzędnych (wiersze listy).

można zrobić coś takiego w kodzie:

(wewnątrz metody getView(), na przykład)

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

Oznacza to, że rozwiązanie jest po prostu użyć (Widok) metodę indexOfChild do pobierz indeks widoku podrzędnego, który został naciśnięty przez użytkownika (długi).

1

Oto mój kodeks.

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

Przeniesienie tutaj jest instancją głównej klasy. za każdym razem, gdy klikam przycisk deletebutton, przekazuję pozycję tego elementu na liście w tym wierszu.

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

następujące prace dla mnie:

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

Wydaje się, że można uzyskać indeks (lub stanowisko) o klikniętego elementu w ListView następująco:

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

Więc trzeba słuchać kliknięć w Widoki, a następnie pobrać z tego indeks.

0

Usunąć pozycji:

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

Takie jak ostatni:

mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1)); 
Powiązane problemy