2010-10-24 20 views
5

Bir grup sayıyı (ağırlık) gösteren bir Liste Etkinliği üzerinde çalışıyorum. ListView'de belirli bir satırın arka planını değiştirmek istiyorum. Bunu yapmak için ArrayAdapter sınıfının özel bir uygulamasını oluşturdum ve getView yöntemini geçersiz kıldım. Adaptör bir sayı listesi kabul eder ve satırın arka planını 20 ile sarı arasında (basit nedenlerden dolayı) ayarlar.Özel ArrayAdapter set getView'daki arka plan alanı

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private List<Integer> mWeights; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
     super(context, android.R.layout.simple_list_item_1, objects); 

     mWeights = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     int itemWeight = mWeights.get(position); 
     if (itemWeight == 20) { 
      v.setBackgroundColor(Color.YELLOW); 
     } 
     return v; 
    } 

} 

sorun numarası 20 ile satır sadece sayı 0 (ilk satır) ile sarı bir arka plan değil, aynı zamanda satırı olur ve bu durumun nedenlerini emin değilim olmasıdır.

getView yönteminde yanlış bir şey yapıyorum (süper yöntemi çağırmak gibi)? Uygulamanızın gerekçeleri şöyledir: Tüm geri döndürülen görüşler aynı olmalıdır (bu yüzden süper yöntemi arıyorum) sadece ölçütler değiştirilmeli ise görünüm değiştirilmelidir.

Yardımlarınız için teşekkürler!

cevap

3

Bunun nasıl yapılmasının gerektiğini öğrenmek için biraz araştırma yaptım.

Bunu başkalarına da aynı sorunla yazıyorum, sanırım bunun nasıl yapılacağı doğru yol. Lütfen bana bildirin, eğer yanılıyorsam veya bu çözümün göremediğim herhangi bir kusuru varsa.

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private static final int TYPE_COUNT = 2; 
    private static final int TYPE_ITEM_COLORED = 1; 
    private static final int TYPE_ITEM_NORMAL = 0; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
    super(context, android.R.layout.simple_list_item_1, objects); 
    } 

    @Override 
    public int getViewTypeCount() { 
    return TYPE_COUNT; 
    } 

    @Override 
    public int getItemViewType(int position) { 
    int item = getItem(position); 

    return (item == 30) ? TYPE_ITEM_COLORED : TYPE_ITEM_NORMAL; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View v = super.getView(position, convertView, parent); 
    switch (getItemViewType(position)) { 
    case TYPE_ITEM_COLORED: 
     v.setBackgroundColor(Color.YELLOW); 
     break; 
    case TYPE_ITEM_NORMAL: 
     break; 
    } 

    return v; 

    } 
} 

Görünüşe göre temel sınıf zaten doğru convertView ( getViewItemType ve getViewTypeCount yöntemlere dayalı) getView yönteme geçirilir sağlanması mantık kullanır.

1

Android'in görünümü, her satır için yeniden bir bileşen kullanıyor. Ben de bu problemi yaşadım.

+0

Görüyorum. Bu mantıklı, evet. Şimdi soru şu, bunu çözmenin en iyi yolu nedir. ConvertView'ı dönüştürme veya her ikisi için de stil niteliklerini ayarlama, eğer son ise, seçenekler? – Igor

1

Yeniden kullanımdan kaynaklanıyorsa, neden itemWeight 20'ye eşit değilse, başka bir denetim eklemiyorsunuz? Eşit değilse, arka planı tekrar normale ayarlayın.

+0

Evet, bunu düşündüm ama biraz araştırma yaptım ve başka bir çözüm buldum. – Igor