先看效果图
前面已经给大家介绍了自定义适配器和异步任务,那么今天就需要结合两个内容来显示网络图片了
先给权限<uses-permission android:name="android.permission.INTERNET"/>
把上次写的异步任务类和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 < urls.length; i++) { list.add(urls[i]);//网址存入集合中 } MyAdapter myAdapter = new MyAdapter(this, list);//新建适配器并且传入数据的集合 lv.setAdapter(myAdapter);//设置适配器 }
这样就可以啦,但是如果数据量多,比如我再循环一百次加载一千条数据
for (int j = 0; j < 100; j++) { for (int i = 0; i < urls.length; i++) { list.add(urls[i]);//网址存入集合中 } }
就会出现新的问题,我们会发现,越往下拉,程序越来越卡,最后直接崩溃掉,看Log日志会发现以下问题
就是我们常说的OOM异常(内存溢出),因为我们加载的数据越来越多,内存占用越来越多,最后导致内存装不下这些图片了,程序就奔溃,
其实我们看到的只有固定个数的内容,没有必要把对象一直存储在内存里面,所以我们可以把已经不再屏幕中的item对象拿过来复用,只需修改数据即可,这就 Listview的优化,下次再给大家介绍。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦