`
wiseideal
  • 浏览: 443874 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ListView滑动获取分页 并异步加载每一项的图片

阅读更多

项目有一个需求就是从服务器获取一个分页数据,数据按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();
			}
		}

 

如果大家有好的方法也请不吝赐教

 

  • 大小: 26 KB
  • 大小: 22.4 KB
2
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics