listview一次性加载过多数据肯定会造成用户体验不好的情况,所以在众多的优化方法中,分批次加载就是其中一个比较有效的手段。根据用户的操作每次加载一部分数据内容,以加快显示速度。
在这个加载操作中又有几种方式,比如在listview底部添加加载更多的view,比如监听listview的滑动等。相对我个人来说,感觉监听滑动显示这个比较好,不需要用户再做一次点击操作了。
废话就不多说了 直接上代码:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount)
{
if(firstVisibleItem+visibleItemCount==totalItemCount)
{
dialog.show();//显示加载数据提示框
//开线程去下载网络数据
if (mThread == null || !mThread.isAlive()) {
mThread = new Thread() {
@Override
public void run() {
try {
//这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
adapter.addList(loadDate());//模拟数据加载的过程
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = new Message();
message.what =1;
handler.sendMessage(message);
}
};
mThread.start();
}
}
}
这个方法主要查看当前可见的item加上可见item的数量是否跟listview的item总数是否相等,如果相等,表示已经滚动到底部,可以加载新数据了。我在这里采用了一个模拟数据加载的过程,让线程休眠5秒钟再执行。当线程加载数据完成后,利用handler发送一个消息来通知更新界面listview的数据已经发生改变了。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
dialog.dismiss();
//重新刷新Listview的adapter里面数据
adapter.notifyDataSetChanged();
break;
default:
break;
}
}
};
在这个加载操作中又有几种方式,比如在listview底部添加加载更多的view,比如监听listview的滑动等。相对我个人来说,感觉监听滑动显示这个比较好,不需要用户再做一次点击操作了。
废话就不多说了 直接上代码:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount)
{
if(firstVisibleItem+visibleItemCount==totalItemCount)
{
dialog.show();//显示加载数据提示框
//开线程去下载网络数据
if (mThread == null || !mThread.isAlive()) {
mThread = new Thread() {
@Override
public void run() {
try {
//这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
adapter.addList(loadDate());//模拟数据加载的过程
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = new Message();
message.what =1;
handler.sendMessage(message);
}
};
mThread.start();
}
}
}
这个方法主要查看当前可见的item加上可见item的数量是否跟listview的item总数是否相等,如果相等,表示已经滚动到底部,可以加载新数据了。我在这里采用了一个模拟数据加载的过程,让线程休眠5秒钟再执行。当线程加载数据完成后,利用handler发送一个消息来通知更新界面listview的数据已经发生改变了。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
dialog.dismiss();
//重新刷新Listview的adapter里面数据
adapter.notifyDataSetChanged();
break;
default:
break;
}
}
};
handler的处理很简单,就是取消加载提示框的显示并更新adapter.
没搞明白这里是怎么上传代码的,附上在eoe帖子的地址,可以下载demo