package org.intermine.app.controller;
/*
* Copyright (C) 2015 InterMine
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public Licence. This should
* be distributed with the code. See the LICENSE file for more
* information or http://www.gnu.org/copyleft/lesser.html.
*
*/
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ProgressBar;
import org.intermine.app.util.Views;
public class LoadOnScrollViewController implements AbsListView.OnScrollListener {
private AbsListView.OnScrollListener mWrapped;
private LoadOnScrollDataController mDataController;
private LayoutInflater mLayoutInflater;
private View mFooterView = null;
private Context mContext;
int mCurrentFirstVisibleItem = 0;
int mCurrentVisibleItemCount = 0;
int mCurrentTotalItemCount = 0;
int mCurrentScrollState = -1;
public LoadOnScrollViewController(LoadOnScrollDataController dataController, Context ctx) {
mDataController = dataController;
mContext = ctx;
}
public View getFooterView() {
if (null == mFooterView) {
mFooterView = new ProgressBar(mContext);
}
return mFooterView;
}
public void onStartLoad() {
Views.setVisible(getFooterView());
}
public void onFinishLoad() {
Views.setGone(getFooterView());
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
mCurrentScrollState = scrollState;
loadIfScrollComplete();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
mCurrentFirstVisibleItem = firstVisibleItem;
mCurrentVisibleItemCount = visibleItemCount;
mCurrentTotalItemCount = totalItemCount;
}
private void loadIfScrollComplete() {
if (mCurrentVisibleItemCount > 0
&& mCurrentScrollState == SCROLL_STATE_IDLE
&& (mCurrentFirstVisibleItem + mCurrentVisibleItemCount == mCurrentTotalItemCount)) {
if (mDataController.hasMore() && !mDataController.isLoading()) {
mDataController.loadMore();
}
}
}
public interface LoadOnScrollDataController {
boolean hasMore();
boolean isLoading();
void loadMore();
}
}