先看效果图
前面已经给大家介绍了自定义适配器和异步任务,那么今天就需要结合两个内容来显示网络图片了
先给权限
把上次写的异步任务类和httputil类复制过来,然后在适配器中做如下修改@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(R.layout.my_listview_item, null);//通过mInflater来加载布局
ImageView iv = (ImageView) convertView.findViewById(R.id.iv);//找到对应的控件
MyAsyncTask myAsyncTask = new MyAsyncTask(iv);
myAsyncTask.execute(list.get(position));//拿到集合中的url并开始任务
return convertView;
}
MainActivity数据修改@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
list = new ArrayList<>();//存储对象的集合
//图片的网址
String[] urls = {"http://p4.so.qhmsg.com/t018349127914f495ce.jpg"
, "http://p4.so.qhmsg.com/t01aade72dccf26cffe.jpg"
, "http://p4.so.qhmsg.com/bdr/_240_/t01b4d668163834560e.jpg"
, "http://p3.so.qhmsg.com/bdr/_240_/t01f46840e54a54bee3.jpg"
, "http://p4.so.qhmsg.com/bdr/_240_/t019e2d84e53580b099.jpg"
, "http://p2.so.qhmsg.com/bdr/_240_/t011b8b18003e6a5e77.jpg"
, "http://p2.so.qhmsg.com/bdr/_240_/t011e722a8a032aaecc.jpg"
, "http://p4.so.qhmsg.com/bdr/_240_/t0100fae0e6eb8d624e.jpg"
, "http://p0.so.qhmsg.com/bdr/_240_/t011cd46113908952c0.jpg"
, "http://p1.so.qhmsg.com/bdr/_240_/t01a63ec9efb3f5b06b.jpg"};
for (int i = 0; i
list.add(urls[i]);//网址存入集合中
}
MyAdapter myAdapter = new MyAdapter(this, list);//新建适配器并且传入数据的集合
lv.setAdapter(myAdapter);//设置适配器
}
这样就可以啦,但是如果数据量多,比如我再循环一百次加载一千条数据for (int j = 0; j
for (int i = 0; i
list.add(urls[i]);//网址存入集合中
}
}
就会出现新的问题,我们会发现,越往下拉,程序越来越卡,最后直接崩溃掉,看Log日志会发现以下问题
就是我们常说的OOM异常(内存溢出),因为我们加载的数据越来越多,内存占用越来越多,最后导致内存装不下这些图片了,程序就奔溃,
其实我们看到的只有固定个数的内容,没有必要把对象一直存储在内存里面,所以我们可以把已经不再屏幕中的item对象拿过来复用,只需修改数据即可,这就 Listview的优化,下次再给大家介绍。