2011-09-30 3 views
5

Sto usando TableLayout. che hanno 100 elementi per renderlo scorrevole Sto usando Tablelayout all'interno di ScrollView. Ma devo rilevare se l'utente ha fatto scorrere fino all'ultima riga. Se l'utente è passato all'ultima visualizzazione, all'utente verrà mostrato un messaggio Toast. Ma come sapere che l'utente ha spostato fino all'ultima riga del tablelayout. Ho indicato il codice da TableLayout inside ScrollVie w.Come ottenere l'ultima posizione della vista di scorrimento, scrollview

http://huuah.com/using-tablelayout-on-android/

+0

perché don si usa 'ListView' e' lv.setOnScrollListener() 'OPPURE dare un'occhiata a [questa risposta SO] (http://stackoverflow.com/questions/3948934/synchronise-scrollview-scroll-positions-android/3952629# 3952629) –

+0

Non posso usare listview perché. il progetto è già sviluppato. ha inpri su posti diversi – bapi

+0

prova a guardare sul metodo OverSupcrolled .. – Rejinderi

risposta

13

Se nuova Scrolled posizione + leggi di scorrimento y altezza altezza> = Tableview che significa aver raggiunto la fine della lista.

Per raggiungere questo obiettivo, è necessario scrivere la panoramica di Custiom.

Fase-1 È necessario creare vista di scorrimento personalizzato estendere ScrollView

package com.sunil; 
import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.ScrollView; 

public class LDObservableScrollView extends ScrollView { 

    private LDObservableScrollViewListener scrollViewListener = null; 

    public LDObservableScrollView(Context context) { 
     super(context); 
    } 

    public LDObservableScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public LDObservableScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setScrollViewListener(LDObservableScrollViewListener scrollViewListener) { 
     this.scrollViewListener = scrollViewListener; 
    } 

    @Override 
    protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
     super.onScrollChanged(x, y, oldx, oldy); 
     if(scrollViewListener != null) { 
      scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); 
     } 
    } 

} 

Step-2 creare un listener per rilevare scrollchanged

pacchetto com.sunil; import LDObservableScrollView;

public interface LDObservableScrollViewListener { 

    void onScrollChanged(LDObservableScrollView scrollView, int x, int y, int oldx, int oldy); 

} 

Step-3 nel layout xml anziché ScrollView utilizzare la vista di scorrimento personalizzato

<com.abc.LDObservableScrollView android:layout_width="fill_parent" android:layout_marginTop="1dip" 
     android:id="@+id/OLF_ScrollView" android:layout_height="fill_parent" android:background="@drawable/small_list_back"> 
     <TableLayout android:layout_width="fill_parent" android:id="@+id/OLF_tableLayout_TableLayout" android:layout_height="fill_parent"> 
     </TableLayout> 
    </com.abc.LDObservableScrollView> 

Step-4 Nella classe di attività o dove si vuole rilevare l'evento di scorrimento usare il seguente codice

public class DetectHere implements LDObservableScrollViewListener{ 
... 


LDObservableScrollView scrollView = (LDObservableScrollView)view.findViewById(R.id.OLF_ScrollView); 
     scrollView.setScrollViewListener(this); 

..... 

@Override 
    public void onScrollChanged(LDObservableScrollView scrollView, int x, 
      int y, int oldx, int oldy) { 
     // TODO Auto-generated method stub 
     if((scrollView.getHeight()+y) >= tableLayout.getHeight()){ 
      Log.e("Custom Listener ", "END OF LIST OCCURRED ::"); 
     } 
    } 
+0

Grazie, ha funzionato per me – bapi

1

Questo ha funzionato anche per me, ma il mio valore y su onScrollChanged non g ets superiore all'altezza sulla mia scheda Samsung Galaxy 2 7 ". Ma funziona sul Galaxy Tab 2 10.1" Tutte le idee perché?

[Edit] ho visto ora che questo si verifica quando lo schermo è inferiore a una certa altezza, 1000px per esempio. Perché quando ho fatto il contenuto del mio scroll inferiore a 1200 nella scheda Galaxy da 10,1 "2, ha smesso di funzionare per il rilevamento dell'altezza massima.

[Edit] ho trovato la soluzione, non è stato rilevando le dimensioni del rotolo in modo corretto, al fine di farlo, quello che ho fatto è stato il seguente:

protected void onScrollChanged(int horizontalScrollPosition, int verticalScrollPosition, int previousHorizontalScrollPosition, int previousVerticalScrollPosition) { 
    int scrollTotalHeight = this.getChildAt(0).getHeight() - super.getHeight(); 
    if(_previousImage != null) 
     if(verticalScrollPosition <= 0) _previousImage.setVisibility(View.GONE); 
    if(_nextImage != null) 
     if(verticalScrollPosition >= scrollTotalHeight) _nextImage.setVisibility(View.GONE); 
    super.onScrollChanged(horizontalScrollPosition, verticalScrollPosition, previousHorizontalScrollPosition, previousVerticalScrollPosition); 
}