package in.srain.cube.views.loadmore;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.LinearLayout;
/**
* @author huqiu.lhq
*/
public abstract class LoadMoreContainerBase extends LinearLayout implements LoadMoreContainer {
private AbsListView.OnScrollListener mOnScrollListener;
private LoadMoreUIHandler mLoadMoreUIHandler;
private LoadMoreHandler mLoadMoreHandler;
private boolean mIsLoading;
private boolean mHasMore = false;
private boolean mAutoLoadMore = true;
private boolean mLoadError = false;
private boolean mListEmpty = true;
private boolean mShowLoadingForFirstPage = false;
private View mFooterView;
private AbsListView mAbsListView;
public LoadMoreContainerBase(Context context) {
super(context);
}
public LoadMoreContainerBase(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mAbsListView = retrieveAbsListView();
init();
}
/**
* @deprecated It's totally wrong. Use {@link #useDefaultFooter} instead.
*/
@Deprecated
public void useDefaultHeader() {
useDefaultFooter();
}
public void useDefaultFooter() {
LoadMoreDefaultFooterView footerView = new LoadMoreDefaultFooterView(getContext());
footerView.setVisibility(GONE);
setLoadMoreView(footerView);
setLoadMoreUIHandler(footerView);
}
private void init() {
if (mFooterView != null) {
addFooterView(mFooterView);
}
mAbsListView.setOnScrollListener(new AbsListView.OnScrollListener() {
private boolean mIsEnd = false;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (null != mOnScrollListener) {
mOnScrollListener.onScrollStateChanged(view, scrollState);
}
if (scrollState == SCROLL_STATE_IDLE) {
if (mIsEnd) {
onReachBottom();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (null != mOnScrollListener) {
mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
if (firstVisibleItem + visibleItemCount >= totalItemCount - 1) {
mIsEnd = true;
} else {
mIsEnd = false;
}
}
});
}
private void tryToPerformLoadMore() {
if (mIsLoading) {
return;
}
// no more content and also not load for first page
if (!mHasMore && !(mListEmpty && mShowLoadingForFirstPage)) {
return;
}
mIsLoading = true;
if (mLoadMoreUIHandler != null) {
mLoadMoreUIHandler.onLoading(this);
}
if (null != mLoadMoreHandler) {
mLoadMoreHandler.onLoadMore(this);
}
}
private void onReachBottom() {
// if has error, just leave what it should be
if (mLoadError) {
return;
}
if (mAutoLoadMore) {
tryToPerformLoadMore();
} else {
if (mHasMore) {
mLoadMoreUIHandler.onWaitToLoadMore(this);
}
}
}
@Override
public void setShowLoadingForFirstPage(boolean showLoading) {
mShowLoadingForFirstPage = showLoading;
}
@Override
public void setAutoLoadMore(boolean autoLoadMore) {
mAutoLoadMore = autoLoadMore;
}
@Override
public void setOnScrollListener(AbsListView.OnScrollListener l) {
mOnScrollListener = l;
}
@Override
public void setLoadMoreView(View view) {
// has not been initialized
if (mAbsListView == null) {
mFooterView = view;
return;
}
// remove previous
if (mFooterView != null && mFooterView != view) {
removeFooterView(view);
}
// add current
mFooterView = view;
mFooterView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
tryToPerformLoadMore();
}
});
addFooterView(view);
}
@Override
public void setLoadMoreUIHandler(LoadMoreUIHandler handler) {
mLoadMoreUIHandler = handler;
}
@Override
public void setLoadMoreHandler(LoadMoreHandler handler) {
mLoadMoreHandler = handler;
}
/**
* page has loaded
*
* @param emptyResult
* @param hasMore
*/
@Override
public void loadMoreFinish(boolean emptyResult, boolean hasMore) {
mLoadError = false;
mListEmpty = emptyResult;
mIsLoading = false;
mHasMore = hasMore;
if (mLoadMoreUIHandler != null) {
mLoadMoreUIHandler.onLoadFinish(this, emptyResult, hasMore);
}
}
@Override
public void loadMoreError(int errorCode, String errorMessage) {
mIsLoading = false;
mLoadError = true;
if (mLoadMoreUIHandler != null) {
mLoadMoreUIHandler.onLoadError(this, errorCode, errorMessage);
}
}
protected abstract void addFooterView(View view);
protected abstract void removeFooterView(View view);
protected abstract AbsListView retrieveAbsListView();
}