2010-05-19 14 views
14

Mam przewijania i chcę tylko zdarzenie, które się stało, jeśli jest już przewijane do dołu, ale nie mogę znaleźć sposób sprawdzić, czy przewijanie jest na dole.Skąd wiadomo, że przewijanie jest już przewinięte w dół?

Rozwiąłem to dla przeciwnego; pozwala jedynie zdarzenie się zdarzyć, jeśli już przewijane na górę:

ScrollView sv = (ScrollView) findViewById(R.id.Scroll); 
    if(sv.getScrollY() == 0) { 
     //do something 
    } 
    else { 
     //do nothing 
    } 

Odpowiedz

8

Znalazłem sposób, aby to zadziałało. Musiałem sprawdzić zmierzoną wysokość dziecka do ScrollView, w tym przypadku LinearLayout. Używam < =, ponieważ powinno to również zrobić coś, gdy przewijanie nie jest konieczne. To znaczy. kiedy LinearLayout nie jest tak wysokie jak ScrollView. W tych przypadkach getScrollY jest zawsze 0.

ScrollView scrollView = (ScrollView) findViewById(R.id.ScrollView); 
    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.LinearLayout); 
    if(linearLayout.getMeasuredHeight() <= scrollView.getScrollY() + 
      scrollView.getHeight()) { 
     //do something 
    } 
    else { 
     //do nothing 
    } 
+2

Jako że ScrollView może mieć tylko jedno dziecko, jeśli masz pewność, że istnieje jeden: , jeśli (scrollView.getScrollY() + scrollView.getHeight()> = scrollView.getChildAt (0) .getMeasuredHeight()) {/ * zostały przewinięte do dołu * /} – Tom

+0

Czy zostało to umieszczone w metodzie? jak ten kod został wdrożony? –

+0

@ItzHoudini Zrobiłem to jako ogólne, jak to możliwe, więc możesz go używać w dowolny sposób. – sanna

0

Jeśli scrollView.getHeight() == scrollView.getScrollY + Rozmiar ekranu, to jest przewijane do dołu.

+1

Dziękuję ale gdy przewijania jest w dolnej getScrollY = 349 getBottom = 430 getMeasuredHeight = 430 getHeight = 430 Ostatnie trzy są to samo, bez względu na to, jak głęboko przewinąłem. Jedyną różnicą jest getScrollY. Co to jest screenize, o którym wspomniałeś? Czy brakowało mi tego, żeby to obsługiwać? W tym przypadku powinno być 81 i nie mogę myśleć o niczym takim. – sanna

1

Można uzyskać maksymalną zwój dla szerokości wykonując tę ​​

int maxScroll = yourScrollView.getChildAt(0).getMeasuredWidth() - yourScrollView.getWidth(); 

zmianę getWidth(), aby getHeight() dla pionowych widoków przewijania

5

Oto ona:

public class myScrollView extends ScrollView 
{ 
    public myScrollView(Context context) 
    { 
     super(context); 
    } 
    public myScrollView(Context context, AttributeSet attributeSet) 
    { 
     super(context,attributeSet); 
    } 

    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) 
    { 
     View view = (View)getChildAt(getChildCount()-1); 
     int d = view.getBottom(); 
     d -= (getHeight()+getScrollY()); 
     if(d==0) 
     { 
      //you are at the end of the list in scrollview 
      //do what you wanna do here 
     } 
     else 
      super.onScrollChanged(l,t,oldl,oldt); 
    } 
} 

można użyć myScrollView w układzie xML lub oznacz ją w yo kod ur. Podpowiedź: z powyższym kodem, jeśli użytkownik trafi na koniec listy 10 razy częściej, Twój kod będzie działał 10 razy. W niektórych przypadkach, gdy chcesz załadować dane ze zdalnego serwera, aby zaktualizować listę, zachowanie to byłoby niepożądane (najprawdopodobniej). spróbuj przewidzieć niepożądaną sytuację i ich unikać.

Wskazówka 2: czasami zbliżanie się do końca listy może być właściwym momentem na uruchomienie skryptu. na przykład użytkownik czyta listę artykułów i zbliża się do końca. wtedy zaczniesz ładować więcej zanim zakończy się lista. Aby to zrobić, po prostu to zrobić, aby spełnić swój cel:

if(d<=SOME_THRESHOLD) {} 
+0

dzięki: D, dobrze się bawiłem z tym problemem – rkmax

Powiązane problemy