Android scrollview onScrollChanged
у меня есть фиксированный контент в моем текстовом представлении внутри вида прокрутки. Когда пользователь прокручивается в определенную позицию, я хотел бы начать действие или вызвать Toast
.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/scroller">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent" android:id="@+id/story"
android:layout_height="wrap_content" android:text="@string/lorem"
android:gravity="fill" />
</LinearLayout>
</ScrollView>
моя проблема заключается в реализации защищенного метода onScrollChanged
чтобы узнать положение вида прокрутки.
Я нашел этой ответ, есть ли более простое решение для этого, а не объявление интерфейса, над поездкой scrollview и т. д., Как видно по ссылке I отправлено?
10 ответов
нет.
ScrollView не предоставляет прослушиватель для событий прокрутки или даже способ проверить, как далеко вниз прокрутил пользователь, поэтому вам нужно сделать то, что предлагается по ссылке.
этот вопрос довольно старый, но в случае, если кто-то падает (как у меня):
начиная с API-интерфейс 23, Android в View
есть OnScrollChangeListener
и соответствующий сеттер.
на NestedScrollView из библиотеки поддержки также поддерживает установку прослушивателя прокрутки даже до этого уровня API. Насколько мне известно, NestedScrollView
смогите быть использовано как замена для нормального ScrollView
без каких-либо проблем.
на самом деле есть способ узнать, как далеко прокрутил пользователь. Об этом говорит метод getScrollY() из ScrollView.
я расширил свой scrollView. этой ссылке может помочь.
class MyScroll extends ScrollView {
boolean onTop=true;
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
//Log.d(TAG, "scroll changed: " + this.getTop() + " "+t);
if(t <= 0){
onTop = true;
//Log.d(TAG, "scroll top: " + t);
super.onScrollChanged(l, t, oldl, oldt);
return;
// reaches the top end
}
onTop = false;
View view = (View) getChildAt(getChildCount()-1);
int diff = (view.getBottom()-(getHeight()+getScrollY()+view.getTop()));// Calculate the scrolldiff
if( diff <= 0 ){
// if diff is zero, then the bottom has been reached
}
super.onScrollChanged(l, t, oldl, oldt);
}
}
NestedScrollView так же, как android.штучка.ScrollView, но он поддерживает работу как вложенного прокрутки родителя и ребенка как на новых, так и на старых версиях Android.
1st-используйте привязку NestedScrollView вместо ScrollView
2nd-установите прослушиватель прокрутки, например, чтобы обнаружить перемещение оси Y для headerView по примеру
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
Log.d(TAG, "onScrollChangeForY - scrollY: " + scrollY + " oldScrollY: " + oldScrollY);
int MOVE = -1, SCROLL_UP = 0, SCROLL_DOWN = 1;
float initialPositionY = headerView.getY();
MOVE = scrollY > oldScrollY ? SCROLL_UP : SCROLL_DOWN;
if (MOVE == SCROLL_UP) {
int incrementY = scrollY - oldScrollY;
headerView.setY(initialPositionY - incrementY);
} else {
int incrementY = oldScrollY - scrollY;
headerView.setY(initialPositionY + incrementY);
}
}
});
здесь готовый к использованию компонент, который помогает прослушивать события прокрутки произвольных представлений в Android. Внутренне этот компонент добавляет прослушиватель событий прокрутки ViewTreeObserver на устройствах со старым API Android (аналогично предложенному в ответе Шубхадипа Чаудхури) и просматривает прослушиватель событий прокрутки на устройствах с новым API Android (уровень API 23+).
начиная с API 23 Android M, вы можете использовать OnScrollChangeListener.
scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
//work with parameters
}
});
вы можете использовать этот триггер, чтобы показать тост или начать деятельность
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
// do something when Scroll
}
});