2012-10-04 12 views
29

Sto provando a rilevare quando una vista elenco viene fatta scorrere oltre una determinata soglia fissa in pixel (a metà del primo elemento). Sfortunatamente listview's getScrollY() sembra restituire sempre 0 instad della posizione di scorrimento. C'è un modo per ottenere la posizione di scorrimento effettiva per pixel?Android ListView posizione corrente di scorrimento Y pixel

Ecco il codice che ho provato ad usare, ma come detto restituisce solo 0.

getListView().setOnScrollListener(new AbsListView.OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     Log.d("scroll", "scroll: " + getListView().getScrollY()); 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == 0) 
     Log.d("scroll", "scrolling stopped"); 
    } 
}); 
+0

la correttezza [soluzione] (http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location- y-pixels/35594825 # 35594825) – Sarasranglt

risposta

49

Non esiste la nozione di scorrimento Y per un controllo ListView in Android semplicemente perché l'altezza totale del contenuto è sconosciuta. È nota solo l'altezza del contenuto visualizzato.

Tuttavia, è possibile ottenere la posizione corrente/Y di scorrimento di un elemento visibile utilizzando il seguente trucco: Codice

getListView().getChildAt(0).getTop(); 
+1

Probabilmente intendi questa soluzione http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

Questo è un suggerimento molto buono, grazie @Cyril Mottier :) – JakeP

+7

questo non funziona più. devi aggiungere l'altezza di tutti gli elementi precedenti della prima vista visibile a quel pezzo di codice. Alcune cose di API interne sono cambiate di recente. Spero che l'API sia in grado di includere una funzione semplice per ottenere questo valore ad un certo punto. Tutte le soluzioni là fuori sono hackish e sono destinate a rompersi con le versioni future dell'API. Non si dovrebbe mai scherzare con le visualizzazioni figlio di un listview –

0

Si può provare l'attuazione OnTouchListener e ignorare la sua onTouch(View v, MotionEvent event) e ottenere il X e Y utilizzando event.getX() e event.getY(). Avevo appena creato una demo per scorrere sulla riga di ListView che abiliterà un pulsante di eliminazione per l'eliminazione di un particolare oggetto da ListView. Puoi controllare il codice sorgente dal mio github come ListItemSwipe.

+4

Questa non è un'opzione per l'asse y, poiché 'ListView' scorre a seconda della velocità di' MotionEvent'. –

0

Un refactoring di risposta di Malachiasz. Questa funzione viene utilizzata per l'altezza della riga dinamica.

chiamate ascoltatore onscroll funzione

mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (mCardsListView.getChildCount() > 0) { 
        int scrollY = getScrollY(); 
       } 
      } 
     }); 

getScrollY

private Dictionary<Integer, Integer> mListViewItemHeights = new Hashtable<Integer, Integer>(); 
private int getScrollY() { 
     View child = mCardsListView.getChildAt(0); //this is the first visible row 
     if (child == null) return 0; 

     int scrollY = -child.getTop(); 

     mListViewItemHeights.put(mCardsListView.getFirstVisiblePosition(), child.getHeight()); 

     for (int i = 0; i < mCardsListView.getFirstVisiblePosition(); ++i) { 
      Integer hei = mListViewItemHeights.get(i); 

      //Manual add hei each row into scrollY 
      if (hei != null) 
       scrollY += hei; 
     } 

     return scrollY; 
    } 
Problemi correlati