@Wolfak

Событие когда ScrollView прокручивается до конца?

Добрый вечер.
Разрабатываю приложение под андроид и столкнулся с необходимостью подзагрузки контента при достижения скроллом конца страницы.
Как это можно реализовать? Может есть какое-нибудь событие у ScrollView?
Искал в интернете, ничего полезного не нашел. Желательно с подробным примером.

Пробовал этот метод: не работает:
@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt)  
{ 
    // Grab the last child placed in the ScrollView, we need it to determinate the bottom position. 
    View view = (View) getChildAt(getChildCount()-1); 
 
    // Calculate the scrolldiff 
    int diff = (view.getBottom()-(getHeight()+getScrollY())); 
 
    // if diff is zero, then the bottom has been reached 
    if( diff == 0 ) 
    { 
        // notify that we have reached the bottom 
        Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached" ); 
    } 
 
    super.onScrollChanged(l, t, oldl, oldt); 
}


Может просто не правильно использую. Нужен подробный пример использования с самого объявления скролла.
Спасибо.
  • Вопрос задан
  • 2381 просмотр
Решения вопроса 1
@Wolfak Автор вопроса
Всем спасибо. Наконец разобрался. Сделал путем слияния двух методов:
stackoverflow.com/questions/10713312/can-i-have-on...
и
stackoverflow.com/questions/4953692/android-detect...

ScrollView PageContScroll = (ScrollView) findViewById(R.id.PageContScroll);
        PageContScroll.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {

            @Override
            public void onScrollChanged() {
                if(HaveMorePost == true) {
                    ScrollView PageContScroll = (ScrollView) findViewById(R.id.PageContScroll);
                    LinearLayout HeadTitLay = (LinearLayout) findViewById(R.id.HeadTitLay);
                    LinearLayout PageCont = (LinearLayout) findViewById(R.id.PageCont);
                    int scrollY = PageContScroll.getScrollY();

                    int diff = PageCont.getBottom() - (PageContScroll.getHeight() + scrollY + HeadTitLay.getHeight());

                    // if diff is zero, then the bottom has been reached
                    if(diff <= 0)
                    {
                        Toast toast = Toast.makeText(getApplicationContext(), "Работает!!!", Toast.LENGTH_SHORT);
                        toast.show();
                    }

                }

            }
        });
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@zelan
Кратко обо мне не получится.
В ответ на комментарии к вопросу:

Wolfak: аннотация "Override" говорит, что этот метод переопределен. Переопределен он может быть ТОЛЬКО В ТОМ классе где он уже БЫЛ описан ранее.

Такой метод есть в классе ScrollView, соответственно именно в нем и надо переопределить этот метод, и создать объект.

Данный метод вызывается скроллвиевом всегда, когда положения скроллов меняется. Соответственно нужно внести изменение в логику работы (добавить свои действия).

Есть 2 общих пути (мб есть и другие).

Первый:
ScrollView scroll = new ScrollView(context){     //context - то что должно быть внутри скрола
     @Override 
      protected void onScrollChanged(int l, int t, int oldl, int oldt)  
      { 
             //тут, надо вставить то, что хочешь ( то что описано в твоем методе
      }
}


Получившийся объект вставить на нужное место.

Второй:
Унаследоваться от ScrollView и вставить твой метод (просто вставить тот метод который ты представил). Создать экземпляр унаследованного класса и использовать.

Если все сделаешь правильно, то в окне лога, при опускании скрола до самого низа, будет вылетать сообщение "MyScrollView: Bottom has been reached".

Откровенно метод который взял, не всегда будет работать.

А вообще подучи основы java и НАСЛЕДОВАНИЕ, что бы таких вопросов (о super и переопределении методов не возникало.). Это основы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы