package czd.lib.view.abslistview.recyclable;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.GridView;
public class RecyclableGridView extends GridView implements OnScrollListener {
private OnScrollListener listener;
private int recycleTop = 0, recycleBottom = 0;
public RecyclableGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public RecyclableGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RecyclableGridView(Context context) {
super(context);
}
@Override
public void setOnScrollListener(OnScrollListener l) {
super.setOnScrollListener(l);
this.listener = l;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.listener.onScrollStateChanged(view, scrollState);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.listener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
//recycle
if (firstVisibleItem > 0)
{
for (int i = recycleTop; i < firstVisibleItem; i++)
{
RecyclableItem item = (RecyclableItem)view.getItemAtPosition(i);
if (item != null && item.isLoaded())
{
item.recycle();
}
if (recycleTop < firstVisibleItem - 1)
{
recycleTop++;
}
}
}
//recycle
if (firstVisibleItem + visibleItemCount - 1 < totalItemCount)
{
for (int i = recycleBottom; i > firstVisibleItem + visibleItemCount - 1; i--)
{
RecyclableItem item = (RecyclableItem)view.getItemAtPosition(firstVisibleItem);
if (item != null && item.isLoaded())
{
item.recycle();
}
if (recycleBottom > firstVisibleItem + visibleItemCount - 1)
{
recycleBottom--;
}
}
}
//load
for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount - 1; i++)
{
RecyclableItem item = (RecyclableItem)view.getItemAtPosition(firstVisibleItem);
if (item != null && !item.isLoaded())
{
item.load();
}
}
}
}