项目有一个需求就是从服务器获取一个分页数据,数据按json数组的方式解析出来,每个对象有一个图片url,需要异步进行加载。
所以有两个大的功能点:
1.列表滑动到底时自动获取下一页的数据
2.每个item的图片文件通过异步的方式加载
网上参考了许多做自动分页功能的,都是采用onscrollListener,但是我试用了以后感觉效果并不好。所以决定换一个方法,也是我为了共享自己这点心得而写这篇博客的动力。
我的实现方式是在底部加一个footview,footview是个progressbar 带有一个正在加载的提示信息
大致说下我的文件结构
FootView顾名思义,就是我这里做滑动分页的功臣,具体做法也很简单,考虑的是一旦footview滑入屏幕会触发哪些函数,最后选择了onlayout,不同于scrolllistener,这里滑出再不会被误判了。敲定触发请求分页的事件了。
剩下的就是请求并更新数据了,我的做法是使用监听器模式,在Footview中设置一个请求分页的接口,activity中实现他,监听到请求分页的事件再做数据请求并通知adapter进行更新。
以上就是我做滑动分页的心得,代码在底部放出。
接下来就是异步加载图片数据了,其实类似的文章有很多,我没有仔细研究每一个案例,在我做异步加载的时候也碰到了一个问题。
我的实现方式是每一个item开启一个asynctask,这也是我问题的开始。我做过一个测试,加载不到30条数据,结果创建了接近130个asynctask 报错退出。我的代码如下
IconAsyncTask iconTask = new IconAsyncTask(holder.icon, alist.get(position));
iconTask.execute(new ApkFile[]{alist.get(position)});
肯定不能这样没节制的创建,一定需要一些约束条件。于是我想到了
if(alist.get(position).getIconResource() == null){
IconAsyncTask iconTask = new IconAsyncTask(holder.icon, alist.get(position));
iconTask.execute(new ApkFile[]{alist.get(position)});
}else{
holder.icon.setImageBitmap(alist.get(position).getIconResource());
}
这样,即使同一个item可能会刷多次(原因后面说),但对应list的数据如果判断不过,那么就不会重复创建asynctask了,问题解决。
刷新多次其实也是个很头疼的问题,感觉还必须这么做。
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(result != null){
MyLog.d("getImage");
apkFile.setIconResource(result);
iconView.setImageBitmap(result);
notifyDataSetChanged();
}
}
如果大家有好的方法也请不吝赐教