Android: обнаружение, когда ScrollView прекращает прокрутку - PullRequest
82 голосов
/ 18 ноября 2011

Я использую ScrollView в Android, и где видимая часть ScrollView имеет тот же размер, что и одна из ячеек внутри Scrollview.Каждая «клетка» имеет одинаковую высоту.Так что я пытаюсь сделать это щелкнуть в положение после прокрутки ScrollView.

В настоящее время я обнаруживаю, когда пользователь коснулся ScrollView и когда он начал прокручивать и обрабатывать его оттуда, но он довольно глючный.Он также должен работать, когда пользователь просто щелкает его, и он прокручивает, а затем замедляет.* закончил прокрутку.Есть ли такая вещь с Android?Или есть какой-то код, на который я мог бы посмотреть, чтобы найти лучший способ сделать это?

Я просмотрел документы по Android и не смог найти ничего подобного.

Ответы [ 15 ]

2 голосов
/ 18 ноября 2011

Я думаю, что это произошло в прошлом.AFAIK, ты не можешь легко обнаружить это.Я предлагаю вам взглянуть на ScrollView.java (именно так мы и поступаем в Android land :) ) и выяснить, как вы можете расширить класс, чтобы предоставить вам функциональностьищем.Это то, что я бы попробовал сначала:

 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
     if (mScroller.isFinished()) {
         // do something, for example call a listener
     }
 }
2 голосов
/ 18 ноября 2011

Попробуйте взглянуть на этот вопрос здесь, в StackOverflow - он не совсем совпадает с вашим вопросом, но дает представление о том, как вы можете управлять событием прокрутки ScrollView. * 1004. *

В основном вам нужно создать свой собственный CustomScrollView, расширив ScrollView и переопределив onScrollChanged(int x, int y, int oldx, int oldy). Затем вам нужно сослаться на это в файле макета вместо стандартного ScrollView, например com.mypackage.CustomScrollView.

1 голос
/ 17 июля 2014

Здесь есть несколько отличных ответов, но мой код может обнаружить, когда прокрутка останавливается без необходимости расширять класс ScrollView.каждый экземпляр представления может вызывать getViewTreeObserver ().удерживая этот экземпляр ViewTreeObserver, вы можете добавить OnScrollChangedListener с помощью функции addOnScrollChangedListener ().

объявите следующее:

private ScrollView scrollListener;
private volatile long milesec;

private Handler scrollStopDetector;
private Thread scrollcalled = new Thread() {

    @Override
    public void run() { 
        if (System.currentTimeMillis() - milesec > 200) {
            //scroll stopped - put your code here
        }
    }
}; 

и в вашем onCreate (или другом месте) добавьте:

    scrollListener = (ScrollView) findViewById(R.id.scroll);

    scrollListener.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() {

        @Override
        public void onScrollChanged() {
            milesec = System.currentTimeMillis();
            scrollStopDetector.postDelayed(scrollcalled, 200);
        }
    });

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

1 голос
/ 01 июня 2014

Я внес некоторые улучшения в ответ ZeroG. В основном, отмена лишних вызовов задач и реализация всего этого как частного OnTouchListener, так что весь код обнаружения прокрутки будет в одном месте.

Вставьте следующий код в вашу собственную реализацию ScrollView:

private class ScrollFinishHandler implements OnTouchListener
{
        private static final int SCROLL_TASK_INTERVAL = 100;

        private Runnable    mScrollerTask;
        private int         mInitialPosition = 0;

        public ScrollFinishHandler()
        {
            mScrollerTask = new Runnable() {

                public void run() {

                    int newPosition = getScrollY();
                    if(mInitialPosition - newPosition == 0)
                    {//has stopped

                       onScrollStopped(); // Implement this on your main ScrollView class
                    }else{
                        mInitialPosition = getScrollY();
                        ExpandingLinearLayout.this.postDelayed(mScrollerTask, SCROLL_TASK_INTERVAL);
                    }
                }
            };
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) 
        {
            if (event.getAction() == MotionEvent.ACTION_UP) 
            {

                startScrollerTask();
            }
            else
            {
                stopScrollerTask();
            }

            return false;
        }

}

А затем в вашей реализации ScrollView:

setOnTouchListener( new ScrollFinishHandler() );
0 голосов
/ 18 ноября 2011
        this.getListView().setOnScrollListener(new OnScrollListener(){
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
                     if( firstVisibleItem + visibleItemCount >= totalItemCount ) 
                              // Last item is shown...

            }

Надеюсь, что фрагмент кода:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...