2011-03-25 15 views
8

Aynı türdeki öğelerle iki ListView (A ve B) var (bir sınıf oluşturdum)ListView öğesinin görünümü nasıl alınır?

A'dan bir öğeye tıkladığımda, bu nesneyi B'ye ekler ve tekrar tıklarsam onu ​​kaldırır. . Sadece bir öğe seçildiğinde, view.setBackgroundColor (myColor) kullanarak arka planını değiştiririm.

Öğeyi B listesinden kaldırmak istiyorum (çalışır), ancak arka plan rengini de sıfırlamak istiyorum. Çıkardığım bu öğenin görünümünü nasıl alacağımı anlayamıyorum.

Herhangi bir fikrin var mı?

+0

bunu yaptı. – Phonon

+0

Listeler arasında geçiş yapmak için sekmeler kullandığımı söylemeyi unuttum. Kodla ilgili olarak, çok karmaşık bir şey yok, ArrayAdapters'ı genişlettim ve onClick view.setBackgroundColor (myColor) – Lucas

cevap

10

Belli bir ListView öğesinin herhangi bir zamanda bile bir görünümünün olacağı konusunda hiçbir garanti yoktur. Öğe şu anda ekran dışı ise, o zaman bir görünüme sahip olmayabilir. Belirli bir öğenin bir görünümü olmayabilir, öğenin görünümünü elde etmek için herhangi bir mantıklı olmayabilir.

Bunun ötesinde, ListView, görünümleri oluşturduğunda ve yeniden kullandığında, doğrudan görünümleri değiştirirseniz, bazı garip ve istenmeyen etkiler görürsünüz. Kullanıcı listede ilerledikçe, görünür hale gelen öğeler, görünür bölümün dışına düşmüş diğer öğelerle aynı arka plana sahip olarak hatalı bir şekilde sonuçlanır.

İşlevselliği uygulamanın en iyi yolunun aşağıdakilerden hangisinde olduğunu bilmiyorum çünkü bir değişiklikten sonra listeyi yeniden oluşturma maliyetini bilmiyorum.

  1. isInSecondList gibi, veri nesnesine bir şey başka boolean Üye ekle: İşte bu yapacağını (muhtemelen naif) yoludur.
  2. Bağdaştırıcıda getView()'u geçersiz kılın. getView()'da, öğenin isInSecondList değerine bağlı olarak arka planını normal veya vurgulanmış olarak ayarlayın.
  3. Bir öğe eklendiğinde veya ikinci listeden kaldırıldığında, değişikliği yansıtmak için veri nesnesini güncelleyin, ardından Bağdaştırıcının notifyDataSetChanged() numaralı telefonunu arayın. İşte
+0

'u kullanıyorum Merhaba, çözümü beğenmiyorum. Sadece yeterince açık değildim, belki size söyleyeceklerimi eklemek isteyecekler. Eğer iki listeyi tutan tek bir TabActivite kullandım. – Lucas

+0

Booleanı eklemedim, bunun yerine listenin nesneyi içerip içermediğini kontrol ettim. Adım 2 ve 3'e gelince, önerdiğin şeyi yaptım ve mükemmel çalışıyor. Teşekkürler! – Lucas

+0

Bence cevap sayısı 3 liste görünümünde görünümü almak için en iyi yoldur – Milaaaad

5
int position = 0; 
listview.setItemChecked(position, true); 
View wantedView = adapter.getView(position, null, listview); 
+0

EVET, android görünümünde liste görünümü taban görünümü almak için iyi bir yol teşekkür ederim, ben 10 veya daha fazla yol test ama en iyi – Milaaaad

0

kodunuzda (ilgili bölümü) bazı, size yardımcı çok daha kolay olacaktır bize gösterirseniz ben

private View oldSelection; 

@Override 
public void onItemClick(AdapterView<?> arg0, View view, int position, 
     long arg3) { 
     highlightSelectdListItem(position); 
} 

    public void highlightSelectdListItem(int position) { 
    clearPreviousSelection(); 
    View newsItemView = mGridVIew.getChildAt(position); 
    oldSelection = newsItemView; 
    newsItemView.setBackgroundColor(Color.GRAY); 
    } 


public void clearPreviousSelection() { 
    if (oldSelection != null) { 
     oldSelection.setBackgroundColor(Color.TRANSPARENT); 
    } 

} 
+0

onun çalışmaz çünkü -düzey listesi görünümü, mesela 50. maddeye bastığımda madde tıklama pozisyonunda bu kod dönüşü ** null ** ---> 'View newsItemView = mGridVIew.getChildAt (konum);' bunun nedeni görünüm listede görüntülenen öğenin en üstündeki pozisyonu hesaplamıyor – Milaaaad

İlgili konular