2011-01-04 17 views
8

ListView'de öğeleri görüntülemek için özelleştirilmiş bir BaseAdapter kullanıyorum. Öğeler bir ArrayList'te tutulan dizelerdir. Özel bir BaseAdapter kullanarak bir ListView öğesinden silme

liste öğeleri

üzerlerinde bir silme düğmesi (büyük kırmızı X) var ve ben ArrayList'den öğeyi kaldırmak ve kendisini güncellemek için ListView bildirmek istiyorum.

Ancak, ben denedim her uygulama madde 5 en silecektir madde 2'nin silme düğmesine tıklayarak nedenle örneğin, kendisine verilen gizemli pozisyon numaralarını alır. Neredeyse tamamen rastgele görünüyor. Unutulmaması gereken

bir şey elemanları tekrarlanabilir, ancak aynı sırada tutulmalıdır olmasıdır. Mesela ben elemanlar 3 olarak, "İrlanda" iki kere olabilir ve 7.

Benim kod aşağıda:

private static class ViewHolder { 
     TextView lang; 
     int position; 
} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.language_link_row, null); 
     holder = new ViewHolder(); 
     holder.lang = (TextView)convertView.findViewById(R.id.language_link_text); 
     holder.position = position; 

     final ImageView deleteButton = (ImageView) 
       convertView.findViewById(R.id.language_link_cross_delete); 
     deleteButton.setOnClickListener(this); 

     convertView.setTag(holder); 
     deleteButton.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.lang.setText(mLanguages.get(position)); 

    return convertView; 
} 

Daha sonra etiketi kapma tarafından silindi elementin pozisyonunu alma denemesinde, ancak her zaman var listede yanlış pozisyon. Burada verilen pozisyonda göze çarpan bir model yoktur, her zaman rasgele görünür.

// The delete button's listener 
public void onClick(View v) { 

    ViewHolder deleteHolder = (ViewHolder) v.getTag(); 
    int pos = deleteHolder.position; 

    ... 
    ... 
    ... 
} 

Sadece ArrayList'den öğeyi silmek ve ListView kendisini güncellemek için oldukça mutlu olurdu, ama ben alıyorum pozisyon yüzden bunu yapamam yanlıştır.

İlk başta, GetView yöntemi içinde deleteButton clickListener var yaptı ve değerini silmek için 'pozisyon' kullanılmış lütfen unutmayın ama aynı problem vardı.

herhangi bir öneriniz bu gerçekten beni rahatsız edici, takdir.

cevap

5

Sen konumunu belirlemeye her zaman ayarlamak zorunda. Uygulamanız sadece görüntünün oluşturulmasındaki konumu belirler. Ancak görünüm geri dönüştürüldüğünde (convertView boş değilse), konum doğru değere ayarlanmayacaktır.

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.language_link_row, null); 
     holder = new ViewHolder(); 
     holder.lang = (TextView)convertView.findViewById(R.id.language_link_text); 

     final ImageView deleteButton = (ImageView) 
       convertView.findViewById(R.id.language_link_cross_delete); 
     deleteButton.setOnClickListener(this); 

     convertView.setTag(holder); 
     deleteButton.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.lang.setText(mLanguages.get(position)); 
    holder.position = position; 
    return convertView; 
} 
+1

Parlak, teşekkürler. Böyle aptalca bir problem için çok uzun zaman harcadığıma inanamıyorum. Genel çözümümüzü, ilgilenenler için ayrı bir cevap olarak ekledim. – HXCaine

0

Eğer OnItemClickListener arabirimini uygulamak ve onItemClick yönteminde öğeyi silmek gerekir, yöntemin bir parametre pozisyonudur.

+1

bir düğmeye sahiptir, böylece dinleyici uygun olmayacaktır. Bu dinleyici yalnızca tüm liste öğesi tıklama olayını aldığında çalışır. –

0

Benim son çözüm Greg tarafından kabul cevabı kullanmaktı ve şu: (bu yapıcı boş olarak başlangıca getirilir) tuşları olarak madde pozisyonlarla, bir HashMap

  • Mağaza sahipleri Özel HashMap mHolders; OnClickListener yöntemi olarak

  • bunu kullanın:

public void onClick(View v) { 
    ViewHolder deleteHolder = (ViewHolder) v.getTag(); 
    int pos = deleteHolder.position; 
    mHolders.remove(pos);

ViewHolder currentHolder; 

    // Shift 'position' of remaining languages 
    // down since 'pos' was deleted 
    for(int i=pos+1; i<getCount(); i++){ 
     currentHolder = mHolders.get(i); 
     currentHolder.position = i-1; 
    } 
    mLanguages.remove(pos); 
    notifyDataSetChanged(); 
} 
[garip biçimlendirme bağışlayın. Kod yerleştirme düzgün çalışmıyor]

İlgili konular