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();
}
}
Ответы
Ответ 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);
}
});