2008-11-02 15 views
101

'dan çocuk görünümlerine erişme Bir öğenin bir ListView kullanılarak görüntülenen listede piksel konumunu bulmam gerekiyor. TextView'ın'dan birini almalı ve getTop()'u kullanmalıyım, ancak bir ListView'un alt görünümünün nasıl alınacağını anlayamıyorum.Android: Bir AccessView

Güncelleme:ViewGroup çocukları 1-to-1 ListView için listedeki öğeleri ile karşılık gelmez. Bunun yerine, ViewGroup'un çocukları yalnızca şu anda görülebilen görüntülere karşılık gelir. Bu nedenle getChildAt(), ViewGroup'un içerdiği bir dizinde çalışır ve listede ListView'un kullandığı konumla ilgili bir şey yapması gerekmez.

cevap

210

Bkz: Android ListView: get data index of visible item ve üzeri Ayakla gelen cevabın parçası ile birleştirmek, size böyle bir şey verebilir:

int wantedPosition = 10; // Whatever position you're looking for 
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0 
int wantedChild = wantedPosition - firstPosition; 
// Say, first visible position is 8, you want position 10, wantedChild will now be 2 
// So that means your view is child #2 in the ViewGroup: 
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) { 
    Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen."); 
    return; 
} 
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead. 
View wantedView = listView.getChildAt(wantedChild); 

faydası, bir performans isabet alabilir, hangi ListView çocukları üzerinde yineleme olmamasıdır .

+10

Büyük cevap, ama listenizde başlık görünümleri olduğunda oldukça doğru çalışmıyor. 'FirstPosition' ataması, int ilkPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); 'dır. – pospi

+0

@pospi: teşekkürler, iyi nokta! Bunun için hesabımı cevaplandırdım. – Joe

+33

Bir doktor musunuz? çünkü sen bir hayat kurtarıcısın. Benim için –

5

ListView sınıfı için belgelerin hızlı araması, ViewGroup'dan alınan getChildCount() ve getChildAt() yöntemlerini döndürdü. Bunları kullanarak bunları yineleyebilir misin? Emin değilim ama denemeye değer.

View element = listView.getListAdapter().getView(position, null, null); 

Sonra üzerine unsurları belirlemek için Getleft() ve getTop() aramak gerekir:

o here

+1

kullanım dizisi adaptörü. Genellikle çalışır, ancak bazen teker teker hataları vardır ve güvenilir değildir. Tavsiye etmem. – Timmmm

+0

Teşekkürler Timmmm, Gerçekten denemedim. – Feet

-9

Bu ListView elemanın konumunu biliyor varsayar Bulundu ekran konumu.

+42

'getView()', listeyi doldururken ListView tarafından dahili olarak çağrılır. Sen * bu listeden görünümü almak için kullanmayın, 'getView()' null ile 'convertView' için çağrılırken bağdaştırıcının adaptörün düzen kaynağından yeni bir görünümü şişirmesine neden olur. zaten görüntüleniyor görünümü). – Joe

+2

Mükemmel nokta! – jasonhudgins

+1

Hatta konum, adaptörün veri kaynağı konumuna değil, görsel ekranda bir konum olacaktır. – Vikas

15

Bu kod kullanımı daha kolaydır:

Temelde
View rowView = listView.getChildAt(viewIndex);//The item number in the List View 
    if(rowView != null) 
     { 
      // Your code here 
     } 
+0

Bu iyi çalışıyor. Neden bir downvote aldığını bilmiyorum ... upvote! – Mark

+9

her zaman çalışmıyor. getChildAt, verilerin üst kısmından değil, ilk görünen satırdan sayar. – SteelBytes

+13

ViewID bağımsız değişkeni kafa karıştırıcı. Bu bir endeks (veya pozisyon). Görünüm Kimliği aapt aracı tarafından oluşturulan tamamen keyfi bir tamsayıdır. –

5
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) 
{  
    View v; 
    int count = parent.getChildCount(); 
    v =parent.getChildAt(position); 
    parent.requestChildFocus(v, view); v.setBackground(res.getDrawable(R.drawable.transparent_button)); 
      for (int i=0; i<count; i++) 
      { 
       if (i!= position) 
       { 
        v = parent.getChildAt(i);t v.setBackground(res.getDrawable(R.drawable.not_clicked)); 

       } 
      } 
     } 
    }); 

, iki drawables oluşturmak - İstenen rengi şeffaf ve diğeri daha. Odağı tıklanan konumda (tanımlı olarak tanımlanmış konum) isteyin ve söz konusu satırın rengini değiştirin. Ardından, listview numaralı ana hattan yürüyün ve diğer tüm satırları buna göre değiştirin. Bu, bir kullanıcının listview'u birden çok kez tıkladığında hesaplar. Bu, listview'daki her satır için özel bir düzen ile yapılır. (Çok basit, bir textview ile sadece yeni bir düzen dosyası - odaklanabilir veya tıklanabilir set yok!) Hiçbir özel adaptör gereklidir - Ben seçimleri yapmak için, bu denedim

+0

getChildAt geçerli kaydırılmış öğelere göre. Listenizi sadece biraz kaydırırsanız, bu çalışmayı durduracaktır. – nurettin

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

Biraz dikkatli ol – innoSPG

+0

Tanrı seni korusun, hayatımı kurtar. – Euphor08