Как узнать, что scrollview уже прокручивается вниз?

У меня есть scrollview, и мне нужно только, чтобы событие произошло, если оно уже прокручивается донизу, но я не могу найти способ проверить, находится ли прокрутка в нижней части.

Я решил это для противоположного; только разрешить событие, если оно уже прокручивается вверху:

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

Ответы

Ответ 1

Я нашел способ заставить его работать. Мне нужно было проверить измеренную высоту ребенка на ScrollView, в этом случае LinearLayout. Я использую < =, потому что он также должен что-то делать, когда прокрутка не требуется. То есть когда LinearLayout не так высок, как ScrollView. В таких случаях getScrollY всегда 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

Вот он:

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);
    }
}

Вы можете использовать myScrollView в макете xml или создать его в своем коде. Подсказка: с кодом выше, если пользователь попадает в конец списка в 10 раз чаще, чем ваш код будет работать 10 раз. В некоторых случаях, например, когда вы хотите загрузить данные с удаленного сервера для обновления своего списка, это поведение будет нежелательным (скорее всего). попробуйте предсказать нежелательную ситуацию и избежать их.

Подсказка 2: иногда приближение к концу списка может быть подходящим временем для запуска вашего script. например, пользователь читает список статей и приближается к концу. то вы начнете загружать больше до завершения списка. Для этого просто выполните это для достижения своей цели:

if(d<=SOME_THRESHOLD) {}

Ответ 3

Вы можете получить максимальную прокрутку для ширины, сделав это

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

изменить getWidth() на getHeight() для вертикальных просмотров прокрутки

Ответ 4

Если scrollView.getHeight() == scrollView.getScrollY + экранируется, то он прокручивается вниз.