Android用ListView加载数据,若数据量大。一次性加载会出现卡顿现象,所以分批次加载有利于用户体验。
//声明所需要的两个变量。第一个是滑动过程中实时的最后一项数据的索引值;第二项是当前限制加载的数据的总量
private int mVisibleLastIndex;//最后的可见索引项
private int mMaxCount; //数据总量
//listview、适配器
private ListView mListView;
private BaseAdapter mBaseAdapter;
//初始化操作...MyAdapter为自定义的BaseAdapter类。
mBaseAdapter = new MyAdapter(this);
mListView.setAdapter(mBaseAdapter);
mListView.setOnScrollListener(new ScrollListener());
//继承自listview滚动监听接口的自定义类
public class ScrollListener implements OnScrollListener{
@override
public void onScroll(AbsListView view,
int firstVisibleItem,
int visibleItemCount,
int totalItemCount){
/**
* 滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
* visibleItemCount:当前能看见的列表项个数(小半个也算)
*/
//滑动的过程中,实时更新当前底部索引值。
mVisibleLastIndex = firstVisibleItem + visibleItemCount - 1;
//当前适配器的容量达到限制总量+1或者超过了限制总量,需要取消加载更多。
if (totalItemCount == mMaxCount + 1 || mVisibleLastIndex > mMaxCount) {
//滚动到当前的最后一行数据项,停止加载。可隐藏加载更多控件。
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState){
/**
* 正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调
* 回调顺序如下
* 第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动
* 第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动
*/
//如果当前最后一项数据的索引值等于当前适配器的容量,表明当前已经加载完毕。若没有到达限制的总量,可以请求加载下一批数据
if (mVisibleLastIndex == mBaseAdapter.getCount()) {
//滚动到最后一行,加载下一批数据
}
}
}