ListView多图片下载以及RecyclerView代替ListView与GridView
2016-03-16 09:21
260 查看
这几天一直在研究使用ListVIew多图片进行下载和RecyclerView代替ListView与GridView。
使用ListView 进行多图片异步下载:
MyAdapter adapter = new MyAdapter();
mListView.setAdapter(adapter);
在onCreate中加入上述代码,然后自己写一个MyAdapter的类继承BaseAdapter,会有一些基本方法需要实现(具体作用参考api),在getView这个方法中我们可以取到很多不同的id,也就是说,它需要一个数组,然后它会自己循环(通过不同的position,这个得自己设置每一次循环的数据),依次拿出数组的数据进行相应的操作。(position是一个int类型,从0开始,通过下标拿数据)。实现方法里面会有一个convertView,假如我们有十个item,屏幕一次显示5个,ListView他只会加载一个屏幕的item(初始化),当屏幕下拉的时候,假如从显示第一个到第五个变成了显示第二个到第六个,那么假如通过第一个销毁第六个创建这样的方法,假如频率够快,那么性能可想而知。convertView当你下拉的时候他会将第一个item存入,那么当显示第六个的时候,只需要重新设置数据,然后调用就可以了(convertView是自带的,但是需要自己拿),这样能够大大减少内存压力。
我在getView()里面写一个方法(downLoad()),这个方法实例化并且实现了一个接口(自己写的接口,里面有一个方法用来回调),这个方法的主要作用是下载和缓存以及将下载的数据以文件的形式保存。但是,当我们进入这个方法的时候,肯定是先要读软引用的(非第一次进入),然后读文件(假如有,取完存入软引用),假如第一次进入自然前面的都是空的,那么我们此时就需要开启线程下载(实例化一个MyAsyncTask继承AsyncTask<String, Void, Bitmap>),用构造方法传入需要的值,然后通过
URL c_url = new URL(url);
InputStream bitmap_data = c_url.openStream();
data = BitmapFactory.decodeStream(bitmap_data);
取到需要的数据,然后将数据存入软引用和文件。然后通过调用传入接口的方法返回bitmap,在getView调用的downLoad()方法里的那个实例化完接口里面的方法里对ui进行赋值。想一想为什么需要这样做(性能,UI线程和子线程)
而RecyclerView需要一个
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); //实现GridView效果 两列
或者recyclerView.setLayoutManager(new LinearLayoutManager(context)); //实现ListView效果
实例化Adpter,但是这里是继承RecyclerView.Adapter<MyAdapter.ViewHolder>,ViewHolder作用滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。也就是说相当于有一个存放数据的容器,每次在容器里面拿数据出来对View进行设置就可以了。在onCreateViewHolder里面创造。 然后在onBindViewHolder里面做与getView()里面相似的操作,只是数据的读取使用ViewHolder。
使用ListView 进行多图片异步下载:
MyAdapter adapter = new MyAdapter();
mListView.setAdapter(adapter);
在onCreate中加入上述代码,然后自己写一个MyAdapter的类继承BaseAdapter,会有一些基本方法需要实现(具体作用参考api),在getView这个方法中我们可以取到很多不同的id,也就是说,它需要一个数组,然后它会自己循环(通过不同的position,这个得自己设置每一次循环的数据),依次拿出数组的数据进行相应的操作。(position是一个int类型,从0开始,通过下标拿数据)。实现方法里面会有一个convertView,假如我们有十个item,屏幕一次显示5个,ListView他只会加载一个屏幕的item(初始化),当屏幕下拉的时候,假如从显示第一个到第五个变成了显示第二个到第六个,那么假如通过第一个销毁第六个创建这样的方法,假如频率够快,那么性能可想而知。convertView当你下拉的时候他会将第一个item存入,那么当显示第六个的时候,只需要重新设置数据,然后调用就可以了(convertView是自带的,但是需要自己拿),这样能够大大减少内存压力。
我在getView()里面写一个方法(downLoad()),这个方法实例化并且实现了一个接口(自己写的接口,里面有一个方法用来回调),这个方法的主要作用是下载和缓存以及将下载的数据以文件的形式保存。但是,当我们进入这个方法的时候,肯定是先要读软引用的(非第一次进入),然后读文件(假如有,取完存入软引用),假如第一次进入自然前面的都是空的,那么我们此时就需要开启线程下载(实例化一个MyAsyncTask继承AsyncTask<String, Void, Bitmap>),用构造方法传入需要的值,然后通过
URL c_url = new URL(url);
InputStream bitmap_data = c_url.openStream();
data = BitmapFactory.decodeStream(bitmap_data);
取到需要的数据,然后将数据存入软引用和文件。然后通过调用传入接口的方法返回bitmap,在getView调用的downLoad()方法里的那个实例化完接口里面的方法里对ui进行赋值。想一想为什么需要这样做(性能,UI线程和子线程)
而RecyclerView需要一个
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2)); //实现GridView效果 两列
或者recyclerView.setLayoutManager(new LinearLayoutManager(context)); //实现ListView效果
实例化Adpter,但是这里是继承RecyclerView.Adapter<MyAdapter.ViewHolder>,ViewHolder作用滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。也就是说相当于有一个存放数据的容器,每次在容器里面拿数据出来对View进行设置就可以了。在onCreateViewHolder里面创造。 然后在onBindViewHolder里面做与getView()里面相似的操作,只是数据的读取使用ViewHolder。
相关文章推荐
- Redis 五种数据类型的使用场景
- 在写一个iOS应用之前必须做的7件事(附相关资源)
- Android的Context && 安卓常用系统服务(当前运行包名/当前网络状态和开关网络/音频服务/马达服务)
- java 多线程生产者和消费者例子
- Android xUtils框架
- 7.计算N元等式[穷举]
- 虚函数-运行时多态的理解
- View requires API level 14 (current min is 8)
- Android Studio:xxx is not an enclosing class 错误的解决方法
- 上网调查一下目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?并在Github注册账户,写一篇博客记录注册的过程。
- 使用xfire工具搭建webservice
- popwindow下拉菜单 显示位置问题 类似微信的菜单栏
- poj题目分类
- Hyper-V配置(一)
- springmvc学习笔记--支持文件上传
- 【Linux】Linux中at命令详解 (自动化执行)
- Java获取来访者IP
- SVN常见问题
- Android时间轴的实现
- c++友元函数