2012-04-25 21 views
5
döndürür

Bir listem var Özel bir bağdaştırıcı ile görüntüleyin. Bir şey olduğunda (bir çocukta bir tıklama) bazı hesaplamalar yaparım ve Çocuk Görünümünü değiştiriyorum. Bazı koşullar yerine getirilmişse, tıklanan çocuğa ilgisiz başka bir çocuk da değiştirilmelidir.Bazen listView.getChildAt (int dizini) NULL (Android)

Bu bazen çalışır, ancak bazen başarısız olur ve DDMS görünümü boş olduğunu söylüyor ...

Sana kodu gösterelim:

 if(invalidaEste != -1) 
     { 
      try 
      { 
       View v = lv_data.getChildAt(invalidaEste); 
       if(v== null) 
       { 
        Log.e("MY_LOG", "SIZE " + lv_data.getCount()); 
        Log.e("MY_LOG", "IS_NULL " + String.valueOf(invalidaEste)); 
       } 

       if(invalidaEste >= lv_data.getFirstVisiblePosition() && 
        invalidaEste <= lv_data.getLastVisiblePosition()) 
       { 
        RelacionFacturaPago rpf = (RelacionFacturaPago)lv_data.getAdapter().getItem(invalidaEste); 
        TextView tv = (TextView)v.findViewById(R.id.tv_pendiente); 
        tv.setText(Formato.double2Screen(rpf.getPorPagar())); 
       } 
      } 
      catch (Exception e) 
      { 
       Log.e("MY_LOG", "FAIL"); 
       Log.e("MY_LOG", String.valueOf(invalidaEste)); 
      } 

     } 

invalidaEste istediğim görünümüdür düzenlemek. n null Olduğunda, tamam olup olmadığını kontrol etmek için dizini günlüğe kaydederim. Daima küçüktür veya eşittir listView.getCount()

Bu neden oluyor?

Daha fazla veri: Bu kod, bir AnimationListener dinleyicinin onAnimationStart (Animasyon animasyonu) içinde.

+0

Bağdaştırıcının null değeri var mı? – zapl

+0

olası bir kopyası [görünür görünüm için sıfır döndüren liste görünümü] (http://stackoverflow.com/questions/6766625/listview-getchildat-returning-null-for-visible-children) – rds

cevap

9

Geri dönüşüm nedeniyle, listView.getChildAt() yalnızca görüntülediği konumlar için bir görünüm ve belki bir tane daha gösterecektir. Belki de kodunuzun daha fazlasını paylaşırsanız, sorunu en iyi nasıl çözeceğinizi anlamanıza yardımcı olabiliriz.

+0

Boş görünüm görünür bir görünümdür. – Desenfoque

+1

mmm ... Sanırım senin noktanı görüyorum ... Endeksin 0 görünümü görünmediğinde sorun tetikleniyor ... Ben getChildAt() yöntemini yanlış anlamıyorum ... – Desenfoque

+0

Bu aslında bozuk mu? Şimdiden bu kontrol olduğunuzu görüyorum: 'if (invalidaEste> = lv_data.getFirstVisiblePosition() && invalidaEste <= lv_data.getLastVisiblePosition())' ve başka bir görünüm, görüntülendiğinde bağdaştırıcı tarafından güncelleştirilmelidir . – dmon

1

Bu çocuk ekranda görünmüyorsa, bunun için bir Görünüm olmadığı anlamına gelir. Bunun çalışmayan bir durum olduğuna inanıyorum.

İyi bir uygulama, liste bağdaştırıcınızın arkasındaki verileri değiştirmek ve bağdaştırıcıdaki notifyDataSetChanged() yöntemini çağırmaktır. Bu, adaptörün değiştirdiği listeyi bilgilendirecek ve görünümleri tekrar boyayacaktır.

Görünümü gerçekten el ile güncelleştirmek istiyorsanız, tek çözüm yeni değerleri bir yerde tutmak ve Görünüm görünür hale gelene kadar beklemektir. Bu noktada geçerli bir referansınız var ve güncellemeleri yapabilirsin.

+0

Yanıtınız için teşekkürler .... Kodda gördüğünüz gibi, ben (v) sadece endeks görünür bir öğeye ait olduğunda. NotifyDataSetChanged() yöntemini kullanmıyorum çünkü listView'deki animasyonları iptal ediyor. – Desenfoque

+0

Gördüğünüz çocuğu invalidaEste! = -1 olduğunda görüyorum. Bu, görünür görünüme sahip bir dizin değil, iyi bir dizin olabilecek bir dizin anlamına gelmez. Yapıştırmak istediğiniz ve görünmeyen bir kod var mı? – azertiti

+0

invalidaEste! = -1 sadece bunun geçerli bir dizin olduğunu söyle. Görünür olup olmadığını kontrol etmek için (invalidaEste> = lv_data.getFirstVisiblePosition() && invalidaEste <= lv_data.getLastVisiblePosition()) kullanın. – Desenfoque

4

Dmon ve Azertiti her ikisi de doğru ... listeniz kaydırıldığında kendinizi sıkıntı içinde buluyorsunuz. Görünüm görünmüyorsa, mevcut değil (yani Android tarafından geri dönüştürüldü). içeri kaydırılan koyulduktan sonra görünümüne yeniden inşa edeceğiz böyle bir şey yapmak

çalışması gerekir.

View view; 

int nFirstPos = lv_data.getFirstVisiblePosition(); 
int nWantedPos = invalidaEste - nFirstPos; 

if ((nWantedPos >= 0) && (nWantedPos <= lv_data.getChildCount()) 
{ 
view = lv_data.getChildAt(nWantedPos); 
if (view == null) 
    return; 
// else we have the view we want 
} 
1

ben bir satır kod ile test Ben geçerli bir pozisyon içindeki gitmek gerektiğinde Liste görünümü. Burada değişkenler örnek olarak kullanılmıştır. lv_data ListView ve tv sizin TextView.

if (lv_data.getChildAt(lv_data.getPositionForView(tv)) != null) { 
    int position = lv_data.getPositionForView(tv); 
} 
İlgili konular