title: Android: Infinite Scroll to TOP in listview
body: <p>I'm trying to implement an endless scrolling to top where I would load more data when the user is getting close to the top of the listview (like in a messenger app). I have a scroll to bottom class which works fine, but I don't manage to find a library or modify this code to detect the scroll to top. 
  Could anybody help? </p>
  
  <p>Here is the class :</p>
  
  <pre><code>public abstract class EndlessScrollListener implements AbsListView.OnScrollListener {
      // The minimum amount of items to have below your current scroll position
      // before loading more.
      private int visibleThreshold = 5;
      // The current offset index of data you have loaded
      private int currentPage = 0;
      // The total number of items in the dataset after the last load
      private int previousTotalItemCount = 0;
      // True if we are still waiting for the last set of data to load.
      private boolean loading = true;
      // Sets the starting page index
      private int startingPageIndex = 0;
  
      public EndlessScrollListener() {
      }
  
      public EndlessScrollListener(int visibleThreshold) {
          this.visibleThreshold = visibleThreshold;
      }
  
      public EndlessScrollListener(int visibleThreshold, int startPage) {
          this.visibleThreshold = visibleThreshold;
          this.startingPageIndex = startPage;
          this.currentPage = startPage;
      }
  
      // This happens many times a second during a scroll, so be wary of the code you place here.
      // We are given a few useful parameters to help us work out if we need to load some more data,
      // but first we check if we are waiting for the previous load to finish.
      @Override
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
      {
          // If the total item count is zero and the previous isn't, assume the
          // list is invalidated and should be reset back to initial state
          if (totalItemCount &lt; previousTotalItemCount) {
              this.currentPage = this.startingPageIndex;
              this.previousTotalItemCount = totalItemCount;
              if (totalItemCount == 0) { this.loading = true; }
          }
          // If it’s still loading, we check to see if the dataset count has
          // changed, if so we conclude it has finished loading and update the current page
          // number and total item count.
          if (loading &amp;&amp; (totalItemCount &gt; previousTotalItemCount)) {
              loading = false;
              previousTotalItemCount = totalItemCount;
              currentPage++;
          }
  
          // If it isn’t currently loading, we check to see if we have breached
          // the visibleThreshold and need to reload more data.
          // If we do need to reload some more data, we execute onLoadMore to fetch the data.
          if (!loading &amp;&amp; (totalItemCount - visibleItemCount)&lt;=(firstVisibleItem + visibleThreshold)) {
              onLoadMore(currentPage + 1, totalItemCount);
              loading = true;
          }
      }
  
      // Defines the process for actually loading more data based on page
      public abstract void onLoadMore(int page, int totalItemsCount);
  
      @Override
      public void onScrollStateChanged(AbsListView view, int scrollState) {
          // Don't take any action on changed
      }
  }
  </code></pre>