ListView多图片下载以及RecyclerView代替ListView与GridView

来源:互联网 发布:ps制作淘宝模板 编辑:程序博客网 时间:2024/05/24 07:21

这几天一直在研究使用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。

0 0
原创粉丝点击