Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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:

  1. void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
  2. 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

like image 605
chiranjib Avatar asked May 28 '13 11:05

chiranjib


People also ask

How do I know if my scroll is at the top?

You can check if window. scrollY (the number of pixels the window has scrolled vertically) is equal to 0 . If you want to check if the window has been scrolled to its leftermost, you can check if window. scrollX (the number of pixels the window has scrolled horizontally) is equal to 0 .

How can check scroll up and scroll down in react?

To detect when a user scrolls to bottom of div with React, we can check if the sum of the scrollTop and clientHeight properties of a scrollable element is equal to the scrollHeight property of the same element. We call the useRef hook to create a ref and we assign the returned ref to the inner div, which is scrollable.


2 Answers

try using the setOnScrollListener and implement the onScrollStateChanged with scrollState

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;     }      }   }); 
like image 179
Sunil Kumar Avatar answered Sep 29 '22 23:09

Sunil Kumar


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. =)

like image 23
maXp Avatar answered Sep 29 '22 23:09

maXp