2011-01-15 28 views
11

ArrayList öğesinde bir koleksiyon var. aşağıdaki gibi bir müşteri adaptörü ekleyebilirsiniz: Android: Bir listeden bir öğenin nasıl kaldırılacağıView ve arrayAdapter

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

benim listesinde bu öğelerin her biri için bir silme düğmesi var ama silme düğmesi en onClick() ArrayList orijinal öğe ile nasıl bağlanacağını emin değilim . Birisi bunun nasıl yapılacağını açıklayabilir mi, yoksa beni okuyabileceğim bir öğreticiye yönlendirebilir mi? Alaycı olmayan/azalan yanıtlar büyük ölçüde takdir edilmektedir.

cevap

7

İşte şimdiye kadar benim çözüm güncellemek için adaptör üzerinde notifyDataSetChanged(); çağırmanız gerekir:

yılında getView() yöntem Böyle bir şey yapıyorum:

deleteButton.setTag(position); 

getTag() bir Nesne döndürüyor gibi görünüyor. Bu yüzden, ilk olarak pozisyonu bir Tamsayı nesnesine dönüştürdüm. Çalışıyormuş gibi görünüyor. OnClickListener() yılında

ben aşağıdakileri yapın:

items.remove(index.intValue()); 

Buraya kadar her şey iyi.

+0

Etiketler olmadan - hangi düğmeye tıklandığınızı bilmiyor musunuz? Bana öyle geliyor ki, bunu anlamak için bazı mekanizmaları gözden kaçırdınız. Düğmenin ebeveynini kullanmayı düşünün. – jcuenod

25

Sen ArrayList

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

üzerinde remove() yöntemini çağırabilirsiniz Ve sonra ListView

+0

Evet, ama benim sorunum o öğenin dizini nasıl belirleneceğini tespit etmektir? Kaldırma işleminden önce setTag() 'i başlangıçta getTag() kullanmam gerektiğini düşünüyorum, ancak mümkünse bazı örnek kodları görmek istiyorum. Tekrar teşekkürler. – gonzobrains

+0

ListView'de bir delete (silme) düğmesi ile bir bağlam menüsüm var. Öğeyi esas olarak 'item.getMenuInfo(). Id' (bu kadar basit değil) kullanarak kullanıyorum. Elbette düğmelerinizin de dizinleri var. – jcuenod

0

Bağlam menüsünü kullanırsanız, AdapterContextMenuInfo elde edebilirsiniz ve bu yapı, tıklatılan öğenin dizinini ve kimliğini verir.

+2

ancak veritabanı kimliği değil. – Mikey

5

Öğenin dizinini, bir liste görünümünün alt görünümlerin (listenin satırları) bir koleksiyonu olduğunu fark edebilirsiniz.

Kodunuzdaki böyle bir şey yapabilirsiniz:

(GetView() yöntemi içinde, örneğin)

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

, çözüm için indexOfChild (Görünüm) yöntemini kullanmak basitçe Çocuk görünümü dizinini (uzun) basıldığında.

1

İşte benim Kurallar. Burada transfer ana sınıfın örneğidir. deletebutton'u her tıkladığımda, o satırın bu satırdaki konumunu bu satırda geçiririm. Benim için

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

takiben çalışır:

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

Yani:

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

O aşağıdaki gibi ListView bir tıklanan öğenin dizini (veya konumu) alabilirsiniz görünüyor Görünümlerdeki tıklamaları dinlememiz ve ardından dizini bu listeden almanız gerekir.konuma göre

0

Kaldır:

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

Böyle sonuncusu olarak:

mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1)); 
İlgili konular