2011-05-25 24 views
17

GridView üzerinde uzanan kendi ızgara görünümü işlevlerimi oluşturmaya çalışıyorum. Çözemediğim tek şey, GridView'un geçerli kaydırma konumunu nasıl alacağınızdır.GridView'dan kaydırma konumu nasıl alınır?

getScrollY() her zaman 0 değerini döndürür ve onScrollListener parametreleri, yalnızca gerçek kaydırma konumu değil, görünür bir alt görünüm aralığıdır.

Bu çok zor görünmüyor, ancak web'de bir çözüm bulamıyorum.

Burada bir fikri olan var mı?

cevap

12

Her iyi çözüm, bulamadık ama bu bir piksel mükemmel kaydırma konumu, tür korumak için en azından yapabiliyor: Mutlak bir kaydırma konumu elde edemez By

int offset = (int)(<your vertical spacing in dp> * getResources().getDisplayMetrics().density); 
int index = mGrid.getFirstVisiblePosition(); 
final View first = container.getChildAt(0); 
if (null != first) { 
    offset -= first.getTop(); 
} 

// Destroy the position through rotation or whatever here! 

mGrid.setSelection(index); 
mGrid.scrollBy(0, offset); 

ama görünür bir öğe + yer değiştirme çifti.

NOTLAR:

  • Bu API 8+ içindir.
  • API 16+ içinde mGrid.getVerticalSpacing() ile alabilirsiniz.
  • Son iki satır yerine API 11+ uygulamasında mGrid.smoothScrollToPositionFromTop (dizin, offset) kullanabilirsiniz.

Size yardımcı olur ve size bir fikir verir.

+0

konteyner hangisi temsil eder? lütfen söyle bana –

+0

Belirsiz bir belleğimden, bu bir kopyala/yapıştır hatasıdır ve mGrid olmalıdır. – Christoph

+0

@SalmanAşağı öğeleri içeren görünümü, mGrid'i deneyin, aksi halde –

0

Gingerbread'da, GridView getScrollY() bazı durumlarda çalışır ve bazılarında yoktur. İşte ilk cevaba dayanan bir alternatif. satır yüksekliği ve sütun sayısı bilinmek (ve tüm satırları eşit yüksekliğe sahip olmalıdır):

public int getGridScrollY() 
{ 
    int pos, itemY = 0; 
    View view; 

    pos = getFirstVisiblePosition(); 
    view = getChildAt(0); 

    if(view != null) 
     itemY = view.getTop(); 

    return YFromPos(pos) - itemY; 
} 

private int YFromPos(int pos) 
{ 
    int row = pos/m_numColumns; 

    if(pos - row * m_numColumns > 0) 
     ++row; 

    return row * m_rowHeight; 
} 

ilk cevap da bir GridView piksel-kaydırmak için nasıl iyi bir ipucu verir. İşte scrollTo (0, scrollY) bir GridView eşdeğer kayar genelleştirilmiş bir çözümdür:

public void scrollGridToY(int scrollY) 
{ 
    int row, off, oldOff, oldY, item; 

    // calc old offset: 
    oldY = getScrollY(); // getGridScrollY() will not work here 
    row = oldY/m_rowHeight; 
    oldOff = oldY - row * m_rowHeight; 

    // calc new offset and item: 
    row = scrollY/m_rowHeight; 
    off = scrollY - row * m_rowHeight; 
    item = row * m_numColumns; 

    setSelection(item); 
    scrollBy(0, off - oldOff); 
} 

fonksiyonları bir subclassed GridView içine uygulanır, ancak kolayca harici olarak kaydedildi edilebilir.

+0

İlk örnekte bir hata düzeltildi. – dslamnig

İlgili konular