Detect Scroll Up & Scroll down in ListView

I have the following requirement:

  • At first, data for page no: 2 is fetched from the server & the items are populated in a ListView.
  • Considering that both the prev page & next page are available in a scenario, the following code has been added:

     if(prevPageNo > 0){
        mListViewActual.setOnScrollListener(this);
     }
    
     if(nextPageNo > 0){
        mListViewActual.setOnScrollListener(this);
     }
    

    What conditions should I put to detect scroll up & scroll down on the following methods:

  • void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
  • void onScrollStateChanged(AbsListView view, int scrollState)
  • After the action: scroll up & scroll down is detected , accordingly a service will be called with either the prev page no or next page no , to fetch the items to be populated in the Listview.

    Any inputs will be helpful.

    Gone through the following links but its not returning the correct scroll up / scroll down action:

    link 1 link 2


    尝试使用setOnScrollListener并使用scrollState实现onScrollStateChanged

    setOnScrollListener(new OnScrollListener(){
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
          // TODO Auto-generated method stub
        }
        public void onScrollStateChanged(AbsListView view, int scrollState) {
          // TODO Auto-generated method stub
          final ListView lw = getListView();
    
           if(scrollState == 0) 
          Log.i("a", "scrolling stopped...");
    
    
            if (view.getId() == lw.getId()) {
            final int currentFirstVisibleItem = lw.getFirstVisiblePosition();
             if (currentFirstVisibleItem > mLastFirstVisibleItem) {
                mIsScrollingUp = false;
                Log.i("a", "scrolling down...");
            } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
                mIsScrollingUp = true;
                Log.i("a", "scrolling up...");
            }
    
            mLastFirstVisibleItem = currentFirstVisibleItem;
        } 
        }
      });
    

    Here is a working modified version from some of the above-indicated solutions.

    Add another class ListView:

    package com.example.view;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.AbsListView;
    
    public class ListView extends android.widget.ListView {
    
        private OnScrollListener onScrollListener;
        private OnDetectScrollListener onDetectScrollListener;
    
        public ListView(Context context) {
            super(context);
            onCreate(context, null, null);
        }
    
        public ListView(Context context, AttributeSet attrs) {
            super(context, attrs);
            onCreate(context, attrs, null);
        }
    
        public ListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            onCreate(context, attrs, defStyle);
        }
    
        @SuppressWarnings("UnusedParameters")
        private void onCreate(Context context, AttributeSet attrs, Integer defStyle) {
            setListeners();
        }
    
        private void setListeners() {
            super.setOnScrollListener(new OnScrollListener() {
    
                private int oldTop;
                private int oldFirstVisibleItem;
    
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    if (onScrollListener != null) {
                        onScrollListener.onScrollStateChanged(view, scrollState);
                    }
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    if (onScrollListener != null) {
                        onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
                    }
    
                    if (onDetectScrollListener != null) {
                        onDetectedListScroll(view, firstVisibleItem);
                    }
                }
    
                private void onDetectedListScroll(AbsListView absListView, int firstVisibleItem) {
                    View view = absListView.getChildAt(0);
                    int top = (view == null) ? 0 : view.getTop();
    
                    if (firstVisibleItem == oldFirstVisibleItem) {
                        if (top > oldTop) {
                            onDetectScrollListener.onUpScrolling();
                        } else if (top < oldTop) {
                            onDetectScrollListener.onDownScrolling();
                        }
                    } else {
                        if (firstVisibleItem < oldFirstVisibleItem) {
                            onDetectScrollListener.onUpScrolling();
                        } else {
                            onDetectScrollListener.onDownScrolling();
                        }
                    }
    
                    oldTop = top;
                    oldFirstVisibleItem = firstVisibleItem;
                }
            });
        }
    
        @Override
        public void setOnScrollListener(OnScrollListener onScrollListener) {
            this.onScrollListener = onScrollListener;
        }
    
        public void setOnDetectScrollListener(OnDetectScrollListener onDetectScrollListener) {
            this.onDetectScrollListener = onDetectScrollListener;
        }
    }
    

    And an interface:

    public interface OnDetectScrollListener {
    
        void onUpScrolling();
    
        void onDownScrolling();
    }
    

    And finally how to use:

    com.example.view.ListView listView = (com.example.view.ListView) findViewById(R.id.list);
    listView.setOnDetectScrollListener(new OnDetectScrollListener() {
        @Override
        public void onUpScrolling() {
            /* do something */
        }
    
        @Override
        public void onDownScrolling() {
            /* do something */
        }
    });
    

    In your XML layout:

    <com.example.view.ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    This is my first topic, do not judge me harshly. =)


    this is a simple implementation:

    lv.setOnScrollListener(new OnScrollListener() {
            private int mLastFirstVisibleItem;
    
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
    
            }
    
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
    
                if(mLastFirstVisibleItem<firstVisibleItem)
                {
                    Log.i("SCROLLING DOWN","TRUE");
                }
                if(mLastFirstVisibleItem>firstVisibleItem)
                {
                    Log.i("SCROLLING UP","TRUE");
                }
                mLastFirstVisibleItem=firstVisibleItem;
    
            }
        });
    

    and if you need more precision, you can use this custom ListView class:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.AbsListView;
    import android.widget.ListView;
    
    /**
     * Created by root on 26/05/15.
     */
    public class ScrollInterfacedListView extends ListView {
    
    
        private OnScrollListener onScrollListener;
        private OnDetectScrollListener onDetectScrollListener;
    
        public ScrollInterfacedListView(Context context) {
            super(context);
            onCreate(context, null, null);
        }
    
        public ScrollInterfacedListView(Context context, AttributeSet attrs) {
            super(context, attrs);
            onCreate(context, attrs, null);
        }
    
        public ScrollInterfacedListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            onCreate(context, attrs, defStyle);
        }
    
        @SuppressWarnings("UnusedParameters")
        private void onCreate(Context context, AttributeSet attrs, Integer defStyle) {
            setListeners();
        }
    
        private void setListeners() {
            super.setOnScrollListener(new OnScrollListener() {
    
                private int oldTop;
                private int oldFirstVisibleItem;
    
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    if (onScrollListener != null) {
                        onScrollListener.onScrollStateChanged(view, scrollState);
                    }
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    if (onScrollListener != null) {
                        onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
                    }
    
                    if (onDetectScrollListener != null) {
                        onDetectedListScroll(view, firstVisibleItem);
                    }
                }
    
                private void onDetectedListScroll(AbsListView absListView, int firstVisibleItem) {
                    View view = absListView.getChildAt(0);
                    int top = (view == null) ? 0 : view.getTop();
    
                    if (firstVisibleItem == oldFirstVisibleItem) {
                        if (top > oldTop) {
                            onDetectScrollListener.onUpScrolling();
                        } else if (top < oldTop) {
                            onDetectScrollListener.onDownScrolling();
                        }
                    } else {
                        if (firstVisibleItem < oldFirstVisibleItem) {
                            onDetectScrollListener.onUpScrolling();
                        } else {
                            onDetectScrollListener.onDownScrolling();
                        }
                    }
    
                    oldTop = top;
                    oldFirstVisibleItem = firstVisibleItem;
                }
            });
        }
    
        @Override
        public void setOnScrollListener(OnScrollListener onScrollListener) {
            this.onScrollListener = onScrollListener;
        }
    
        public void setOnDetectScrollListener(OnDetectScrollListener onDetectScrollListener) {
            this.onDetectScrollListener = onDetectScrollListener;
        }
    
    
        public interface OnDetectScrollListener {
    
            void onUpScrolling();
    
            void onDownScrolling();
        }
    
    }
    

    an example for use: (don't forget to add it as an Xml Tag in your layout.xml)

    scrollInterfacedListView.setOnDetectScrollListener(new ScrollInterfacedListView.OnDetectScrollListener() {
                @Override
                public void onUpScrolling() {
                   //Do your thing
                }
    
                @Override
                public void onDownScrolling() {
    
                 //Do your thing
                }
            });
    
    链接地址: http://www.djcxy.com/p/69030.html

    上一篇: 你能配置VS2008代码分析来使用英式英语词典吗?

    下一篇: 检测向上滚动并在ListView中向下滚动