package gueei.binding.collections;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
public class LazyLoadRootAdapterHelper implements OnScrollListener {
// Allow a few items which is close to the viewport to stay
private int extraItems = 2;
private final AbsListView mView;
private final LazyLoadAdapter mAdapter;
private LazyLoadAdapter.Mode mMode;
private boolean busy;
private int lastFirstVisibleItem = 0;
private int lastVisibleItemCount = 0;
// private int lastScrollState = OnScrollListener.SCROLL_STATE_IDLE; // unused
public LazyLoadRootAdapterHelper(AbsListView view, LazyLoadAdapter adapter, LazyLoadAdapter.Mode mode) {
mAdapter = adapter;
view.setOnScrollListener(this);
mMode = mode;
mView = view;
}
public void setMode(LazyLoadAdapter.Mode mode) {
mMode = mode;
}
/**
* Callback method to be invoked when the list or grid has been scrolled. This will be
* called after the scroll has completed
* @param view The view whose scroll state is being reported
* @param firstVisibleItem the index of the first visible cell (ignore if
* visibleItemCount == 0)
* @param visibleItemCount the number of visible cells
* @param totalItemCount the number of items in the list adaptor
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (visibleItemCount > 0) {
lastFirstVisibleItem = firstVisibleItem;
lastVisibleItemCount = visibleItemCount;
int extraFirst = firstVisibleItem - extraItems;
if (extraFirst < 0) {
extraFirst = 0;
}
int extraVisibleItemsCount = visibleItemCount + extraItems;
if (extraVisibleItemsCount > totalItemCount) {
extraVisibleItemsCount = totalItemCount;
}
if (!busy) {
mAdapter.onVisibleChildrenChanged(extraFirst, extraVisibleItemsCount);
}
} else {
lastFirstVisibleItem = 0;
lastVisibleItemCount = 0;
}
}
public boolean isBusy() {
return busy;
}
public void onGetView(int position) {
if (!busy) {
mAdapter.onVisibleChildrenChanged(mView.getFirstVisiblePosition(), mView.getLastVisiblePosition() - mView.getFirstVisiblePosition());
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (mMode.equals(LazyLoadAdapter.Mode.LoadWhenScrolling) || scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
busy = false;
mAdapter.onVisibleChildrenChanged(lastFirstVisibleItem, lastVisibleItemCount);
} else {
busy = true;
}
}
}