Created
July 19, 2013 15:53
-
-
Save twocity/6040230 to your computer and use it in GitHub Desktop.
auto loadmore listview
This file contains 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
public class LoadMoreListView extends ListView implements OnScrollListener { | |
private static final String TAG = "LoadMoreListView"; | |
/** | |
* Listener that will receive notifications every time the list scrolls. | |
*/ | |
private OnScrollListener mOnScrollListener; | |
private LayoutInflater mInflater; | |
// footer view | |
private RelativeLayout mFooterView; | |
// private TextView mLabLoadMore; | |
private ProgressBar mProgressBarLoadMore; | |
// Listener to process load more items when user reaches the end of the list | |
private OnLoadMoreListener mOnLoadMoreListener; | |
// To know if the list is loading more items | |
private boolean mIsLoadingMore = false; | |
private int mCurrentScrollState; | |
public LoadMoreListView(Context context) { | |
super(context); | |
init(context); | |
} | |
public LoadMoreListView(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
init(context); | |
} | |
public LoadMoreListView(Context context, AttributeSet attrs, int defStyle) { | |
super(context, attrs, defStyle); | |
init(context); | |
} | |
private void init(Context context) { | |
mInflater = (LayoutInflater) context | |
.getSystemService(Context.LAYOUT_INFLATER_SERVICE); | |
// footer | |
mFooterView = (RelativeLayout) mInflater.inflate( | |
R.layout.load_more_footer, this, false); | |
/* | |
* mLabLoadMore = (TextView) mFooterView | |
* .findViewById(R.id.load_more_lab_view); | |
*/ | |
mProgressBarLoadMore = (ProgressBar) mFooterView | |
.findViewById(R.id.load_more_progressBar); | |
addFooterView(mFooterView); | |
super.setOnScrollListener(this); | |
} | |
@Override | |
public void setAdapter(ListAdapter adapter) { | |
super.setAdapter(adapter); | |
} | |
/** | |
* Set the listener that will receive notifications every time the list | |
* scrolls. | |
* | |
* @param l | |
* The scroll listener. | |
*/ | |
@Override | |
public void setOnScrollListener(AbsListView.OnScrollListener l) { | |
mOnScrollListener = l; | |
} | |
/** | |
* Register a callback to be invoked when this list reaches the end (last | |
* item be visible) | |
* | |
* @param onLoadMoreListener | |
* The callback to run. | |
*/ | |
public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { | |
mOnLoadMoreListener = onLoadMoreListener; | |
} | |
public void onScroll(AbsListView view, int firstVisibleItem, | |
int visibleItemCount, int totalItemCount) { | |
if (mOnScrollListener != null) { | |
mOnScrollListener.onScroll(view, firstVisibleItem, | |
visibleItemCount, totalItemCount); | |
} | |
if (mOnLoadMoreListener != null) { | |
if (visibleItemCount == totalItemCount) { | |
mProgressBarLoadMore.setVisibility(View.GONE); | |
// mLabLoadMore.setVisibility(View.GONE); | |
return; | |
} | |
boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount; | |
if (!mIsLoadingMore && loadMore | |
&& mCurrentScrollState != SCROLL_STATE_IDLE) { | |
mProgressBarLoadMore.setVisibility(View.VISIBLE); | |
// mLabLoadMore.setVisibility(View.VISIBLE); | |
mIsLoadingMore = true; | |
onLoadMore(); | |
} | |
} | |
} | |
public void onScrollStateChanged(AbsListView view, int scrollState) { | |
mCurrentScrollState = scrollState; | |
if (mOnScrollListener != null) { | |
mOnScrollListener.onScrollStateChanged(view, scrollState); | |
} | |
} | |
public void onLoadMore() { | |
Log.d(TAG, "onLoadMore"); | |
if (mOnLoadMoreListener != null) { | |
mOnLoadMoreListener.onLoadMore(); | |
} | |
} | |
/** | |
* Notify the loading more operation has finished | |
*/ | |
public void onLoadMoreComplete() { | |
mIsLoadingMore = false; | |
mProgressBarLoadMore.setVisibility(View.GONE); | |
} | |
/** | |
* Interface definition for a callback to be invoked when list reaches the | |
* last item (the user load more items in the list) | |
*/ | |
public interface OnLoadMoreListener { | |
/** | |
* Called when the list reaches the last item (the last item is visible | |
* to the user) | |
*/ | |
public void onLoadMore(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment