OnScroll вызывается, когда я устанавливаю listView.onScrollListener(это), но без какого-либо касания - программирование
Подтвердить что ты не робот

OnScroll вызывается, когда я устанавливаю listView.onScrollListener(это), но без какого-либо касания

Когда я устанавливаю onScrollListener для моего ListView, он вызывает onScroll. Это приводит к сбою, поскольку некоторые вещи не были инициализированы.

Это нормально? Примечание: это происходит без меня даже прикосновением к телефону.

public class MainActivity1 extends Activity implements OnClickListener, OnScrollListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);

    ListView lv = (ListView)findViewById(R.id.listview1);
    lv.setOnScrollListener(this);
    ...
}
...
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount){
    if( firstVisibleItem+visibleItemCount == totalItemCount ){
        pullContactList();
    }
}
4b9b3361

Ответ 1

Это нормально, потому что исходный код для setOnScrollListener в AbsListView (суперкласс из ListView) делает это:

 public void setOnScrollListener(OnScrollListener l) {
        mOnScrollListener = l;
        invokeOnItemScrollListener();
    }

и invokeOnItemScrollListener делает следующее:

/**
     * Notify our scroll listener (if there is one) of a change in scroll state
*/
    void invokeOnItemScrollListener() {
        if (mFastScroller != null) {
            mFastScroller.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
        }
        if (mOnScrollListener != null) {
            mOnScrollListener.onScroll(this, mFirstPosition, getChildCount(), mItemCount);
        }
        onScrollChanged(0, 0, 0, 0); // dummy values, View implementation does not use these.
    }

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

ИЗМЕНИТЬ:

Поскольку вы хотите сделать это только в том случае, если пользователь действительно прокручивается, я полагаю, вы могли бы сделать что-то вроде:

    lv.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    if(view == lv && motionEvent.getAction() == MotionEvent.ACTION_SCROLL) {
                      userScrolled = true;
    }
return false;
                }
            });

Тогда..

lv.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount){
        if(userScrolled && firstVisibleItem+visibleItemCount == totalItemCount ){
            pullContactList();
        }
    }

});

Ответ 2

Просто напоминание, согласно javadoc

MotionEvent.ACTION_SCROLL :

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

Это действие не является событием касания, поэтому оно передается в onGenericMotionEvent (MotionEvent), а не onTouchEvent (MotionEvent).

Следовательно, motionEvent.getAction() никогда не получит событие SCROLL. Проверьте, что MOVE выполнит задание

Вы также можете сделать аналогичную вещь в методе onScrollStateChanged OnScrollListener

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
        if(scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
            userScrolled = true;
        }   
}

Ответ 3

Я использую это решение, и оно отлично работает для меня:

public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                canScroll = false;
            } else if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING ||
                    scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                canScroll = true;

            }
        }

Ответ 4

Вы можете выполнить нужную задачу только тогда, когда visibleItemCount > 0;

public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount){
    if (visibleItemCount > 0 ){
        //perform the task to be done
    }
}

Ответ 5

Работала решение для меня!!! сочетание выше ответа я сделал решение! благодаря @LuxuryMode и @CrazyGreenHand

Мой TouchListener: так как MotionEvent.ACTION_SCROLL не срабатывает, я использовал действие MOVE

 expandableListView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if(view == expandableListView && motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                userScrolled = true;
            }
            return false;
        }
    });

Мой прослушиватель прокрутки:

  expandableListView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {

        }

        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (firstVisibleItem == 0){
                swipeRefreshLayout.setEnabled(true);
            }else {
                swipeRefreshLayout.setEnabled(false);
            }
            int lastVisibleItem = absListView.getLastVisiblePosition();
            if (userScrolled&&!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                onLoadMore();
                isLoading = true;
            }
            Log.d(TAG, "onScroll: firstVisibleItem=>"+firstVisibleItem+"==>visibleItemCount=>"+visibleItemCount+"==>totalItemCount==>"+totalItemCount+"==>lastVisibleItem==>"+lastVisibleItem);
        }
    });