Created
May 26, 2015 11:54
-
-
Save rhoadster91/852ed54296da5872bc89 to your computer and use it in GitHub Desktop.
Extended ListView to easily handle pagination. Set OnPageEndReachedListener to get callbacks on page change. Pause pagination while fetching new data. Resume pagination after getting data. Stop pagination once you're done.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import android.annotation.TargetApi; | |
| import android.content.Context; | |
| import android.os.Build; | |
| import android.support.annotation.IdRes; | |
| import android.support.annotation.LayoutRes; | |
| import android.util.AttributeSet; | |
| import android.view.LayoutInflater; | |
| import android.view.View; | |
| import android.widget.AbsListView; | |
| import android.widget.ListView; | |
| import android.widget.ProgressBar; | |
| public class PagedListView extends ListView { | |
| int pageNumber = 0; | |
| int pageSize = 0; | |
| int pageTriggerOffset = 1; | |
| boolean shouldPage = true; | |
| OnPageEndReachedListener mOnPageEndReachedListener; | |
| View loadingView; | |
| ProgressBar progressBar; | |
| View retryButton; | |
| public int getPageNumber() { | |
| return pageNumber; | |
| } | |
| public void setPageNumber(int pageNumber) { | |
| this.pageNumber = pageNumber; | |
| } | |
| public int getPageTriggerOffset() { | |
| return pageTriggerOffset; | |
| } | |
| public void setPageTriggerOffset(int pageTriggerOffset) { | |
| this.pageTriggerOffset = pageTriggerOffset; | |
| } | |
| public int getPageSize() { | |
| return pageSize; | |
| } | |
| public void setPageSize(int pageSize) { | |
| this.pageSize = pageSize; | |
| } | |
| public void setOnPageEndReachedListener(OnPageEndReachedListener onPageEndReachedListener) { | |
| mOnPageEndReachedListener = onPageEndReachedListener; | |
| } | |
| public void stopPaging(boolean allowRetry) { | |
| shouldPage = false; | |
| if(progressBar!=null) { | |
| progressBar.setVisibility(View.GONE); | |
| } | |
| if(retryButton!=null) { | |
| retryButton.setVisibility(allowRetry?View.VISIBLE:View.GONE); | |
| } | |
| } | |
| public void pausePaging() { | |
| shouldPage = false; | |
| } | |
| public void resumePaging() { | |
| shouldPage = true; | |
| if(progressBar!=null) { | |
| progressBar.setVisibility(View.VISIBLE); | |
| } | |
| if(retryButton!=null) { | |
| retryButton.setVisibility(View.GONE); | |
| } | |
| } | |
| public OnPageEndReachedListener getOnPageEndReachedListener() { | |
| return mOnPageEndReachedListener; | |
| } | |
| public PagedListView(Context context) { | |
| super(context); | |
| initScrollListener(); | |
| } | |
| public PagedListView(Context context, AttributeSet attrs) { | |
| super(context, attrs); | |
| initScrollListener(); | |
| } | |
| public PagedListView(Context context, AttributeSet attrs, int defStyleAttr) { | |
| super(context, attrs, defStyleAttr); | |
| initScrollListener(); | |
| } | |
| @TargetApi(Build.VERSION_CODES.LOLLIPOP) | |
| public PagedListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { | |
| super(context, attrs, defStyleAttr, defStyleRes); | |
| initScrollListener(); | |
| } | |
| private void onPageEndReached() { | |
| pageNumber++; | |
| if(mOnPageEndReachedListener!=null) { | |
| mOnPageEndReachedListener.onPageEndReached(pageNumber); | |
| } | |
| } | |
| public interface OnPageEndReachedListener { | |
| void onPageEndReached(int nextPage); | |
| } | |
| private void initScrollListener() { | |
| setOnScrollListener(new OnScrollListener() { | |
| int mLastLastVisibleItem = 0; | |
| @Override | |
| public void onScrollStateChanged(AbsListView absListView, int i) { | |
| } | |
| @Override | |
| public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, | |
| int totalItemCount) { | |
| if (totalItemCount > 0 && mLastLastVisibleItem != getLastVisiblePosition()) { | |
| mLastLastVisibleItem = getLastVisiblePosition(); | |
| if (mLastLastVisibleItem == totalItemCount - pageTriggerOffset && shouldPage) { | |
| onPageEndReached(); | |
| } | |
| } | |
| } | |
| }); | |
| } | |
| public void setPageLoadingView(@LayoutRes int loadingViewLayout, @IdRes int progressBarId, @IdRes int retryButtonId, OnClickListener onRetryButtonClick) { | |
| LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); | |
| loadingView = inflater.inflate(loadingViewLayout, this, false); | |
| progressBar = (ProgressBar) loadingView.findViewById(progressBarId); | |
| retryButton = loadingView.findViewById(retryButtonId); | |
| retryButton.setOnClickListener(onRetryButtonClick); | |
| addFooterView(loadingView); | |
| stopPaging(false); | |
| } | |
| public void reloadCurrentPage() { | |
| if(mOnPageEndReachedListener!=null) { | |
| mOnPageEndReachedListener.onPageEndReached(pageNumber); | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment