在使用listview显示成千上万条数据时, 加载速度可能就会很慢,这样用户体验就不是很好,为解决这个问题,我们可以分批加载ListView的数据。
分批加载ListView的步骤大致如下:首先取出一部分数据显示到ListView上,然后对ListView进行滚动监听,当用户滑动到ListView底部时,又加载一批数据显示到ListView上,
这样分批加载,用户总能看到新的数据。
笔者的简略代码如下:
1.0去数据库查询数据时先查前20条。
Cursor cursor = db.rawQuery(
" select number,mode from blacknumber order by _id desc limit ? offset ?;",new String[] { String.valueOf(maxnumber),String.valueOf(offset) });
2.0将查询出来的部分数据放到list集合中
new Thread() {
public void run() {
if (list == null) {
//list为空时,直接存数据
list = blackNumberDao.findPart(offset, maxnumber);
} else {
//如果不为空,就将后面查询出来的数据加到集合尾部,否则list之前存放的数据将会丢失。
list.addAll(blackNumberDao.findPart(offset, maxnumber));
}
3.0将list集合中的数据显示到ListView上。
runOnUiThread(new Runnable() {
@Override
public void run() {
//如果适配器为空,直接设置即可
if (myAdapter == null) {
myAdapter = new MyAdapter();
lv_call_safe.setAdapter(myAdapter);
//当适配器不为空时,让适配器更新即可,如果重新设置适配器,就会回到ListView首部。
} else {
myAdapter.notifyDataSetChanged();
}
}
});
4.0对ListView进行滚动监听,当滑动到底部时重复以上步骤,继续分批加载剩下的数据。
// listveiw的滚动事件监听
lv_call_safe.setOnScrollListener(new OnScrollListener() {
// 滚动状态发生变化的时候调用
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_FLING:// 惯性滑行
break;
case OnScrollListener.SCROLL_STATE_IDLE:// 空闲状态
//得到ListView最后一个位置
int lastVisiblePosition = view.getLastVisiblePosition();
//滑动到最后一个位置,加载数据
if (lastVisiblePosition == (list.size() - 1)) {
fillData();
}
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 手指触摸滑动
break;
}
}
// 滚动的时候调用
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
View firstVisibleItemView = lv_call_safe.getChildAt(0);
if (firstVisibleItemView != null
&& firstVisibleItemView.getTop() == 0) {
System.out.println("滚动到顶部 ");
}
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
View lastVisibleItemView = lv_call_safe
.getChildAt(lv_call_safe.getChildCount() - 1);
if (lastVisibleItemView != null
&& lastVisibleItemView.getBottom() == lv_call_safe
.getHeight()) {
System.out.println("滚动到底部 ");
}
}
}
});
ListView分批加载数据的过程大致如上。