*【UI适配】BaseAdapter:最常用的适配器

1.什么是数据适配器:通过数据适配器,我们可以将数据源和UI控件联系起来。
2.数据适配器adapter的作用就是将多种多样的数据源适配成listView可以读取的模式。
(1)降低程序的耦合性
(2)容易扩展
3.最常用的数据适配器:BaseAdapter

ListView的显示和缓存机制:需要才显示,显示完就被回收到缓冲池中。
1. 屏幕上滑时,先将item1回收到View缓冲池中
2. 新要显示的item8从View缓冲池中取出,并重新设置好item8所要显示的数据
3. item8显示出来

BaseAdapter基本结构

public int getCount();//适配器中数据集中数据的个数
public Object getItem(int position);//获取数据集中与指定索引对应的数据项
public long getItemId(int position);//获取指定行对应的ID
public View getView(int position,View convertView,ViewGroup parent);//获取每一个Item显示内容

创建一个ItemBean.java文件来封装ListView中的控件。
并在封装文件中写构造函数对成员变量进行初始化。
创建数据源时,将数据源的类型直接定义为List< ItemBean>

List< ItemBean> itemBeanList=new ArrayList<>();

再用循环给ListView的每一行进行赋值。

Adapter继承自BaseAdapter中的将XML转换为View对象:

LayoutInflater mInflater;
mInflater=LayoutInflatet.from(context)

在getView中通过
View view=(View)mInflater.inflate(R.layout.xxx,null)加载Item布局转换为View对象

通过View对象访问到Item布局中的控件
ImageView image=(ImageView)view.findViewById(R.id.xxx)
然后通过
image.setImageResource(mlist.getItem(position).XXXid)设置图片

数据源绑定到ListView上:
listView.setAdapter(new MyAdapter(this,datalist数据源))

新建数据适配器:
1.创建一个MyAdapter.java类,继承BaseAdapter,成员变量mList,在MyAdapter的构造方法中保存传进来的List< ItemBean>类型的数据源。
2.getCount()方法返回ListView需要显示的数据数量 mList.size()获取数据源的数据数量
getItem()方法取指定索引的数据项,mList.get(position)获取position
getItemId()方法获取索引项,直接返回position
getView()方法返回数据项显示的内容:/逗比式,不考虑优化,每次创建新的view,效率低下/
*通过LayoutInflater方法将一个xml文件转换为view对象(之后才能进行控件的初始化findviewbyid操作)
—-成员变量LayoutInflater mInflater;//布局装载器对象
—-mInflater=LayoutInflater.from(context);//context是要使用当前的Adapter的界面对象
*View view=mIflater.inflate(R.layout.item,null)
*对封装的控件分别进行初始化操作
3.MainActivity中初始化ListView控件,并配置适配器listView.setAdapter(new MyAdapter(this,itemBeanList));

1、BaseAdapter的三重境界之普通式的特点:
(1)利用了ListView的缓存特性,若没有缓存才创建新的View,
(2)但是findViewById依然会浪费大量时间;
2、普通式与逗比式的差别
相比于逗比式只是将每次循环中自己创建的view换成getView方法中参数的convertView,调用getView方法先判断view是否为空,不为空则表示已经加载过了存在于缓冲池中,不需要重新创建新的View类对象来转换布局文件;

BaseAdapter的普通式:
充分利用ListView的缓存机制,如果没有缓存才创建新的view.
但是findViewById依然会浪费大量的时间。

BaseAdapter文艺式
1、ViewHolder:getView()方法是利用了ViewHolder类,优化了inflate()和findViewById()的耗时操作。
(1)创建一个ViewHolder对象,通过ViewHolder对象,就将这些通过findViewById()找到的组件对象保存到了ViewHolder对应的组件对象中
(2)通过setTag()方法将这个viewHolder和当前的view建立联系
//这样就可以将没有缓存过的View对象创建出来,并将其每个组件保存在ViewHolder对象中。
(3)当View不为空的时候就可以通过convertView.getTag()将它所关联的viewHoloder对象取出。
(4)最后通过viewHolder中保存的组件对象设置当前的view对象
//通过ViewHolder类其实是优化了findViewById()的耗时操作

微信来举例子。
假设聊天界面最多一次显示8个item,不管你用什么方式,这8个item肯定从内存中申请出来了。但是当上滑加载新的item时,逗比式肯定是每次都申请新的内存,普通式和文艺式都是反复利用这8个item的内存(第9个用第1个的,第10个用第2个的,以此类推)。而且最关键的问题是ConvertView它就在Recycler那个缓冲池里,不管你用还是不用!在调用getView()方法时都会自动传递给你。

假设聊天界面所有item都是同样的布局,那么Recycler里只缓存了1个item!也就是说Recycler里缓存的item数量是这个ListView里【布局类型】的数量。所以对于每个item上控件的人为缓存,谈不上牺牲空间换时间。

总结:
1.无论任何时候都不要使用逗比式。这种方法百害无一利。
2.当可以确定item数量非常少的时候,可以使用普通式,即不必要缓存控件。
3.绝大多数情况请使用文艺式。


对于一些细微的程序比较效率用获取系统纳秒时间方法

关键代码:
long start =System.nanoTime();

long end =System.nanoTime();
long dValue=end-start;

viewholder 作为findviewbyid的一个转接,避免系统大量的遍历提高效率。


ViewHolder优化BaseAdapter
1.创建bean对象,用于封装数据
2.在构造方法中初始化用于映射的数据源list
3.创建ViewHolder类,创建布局映射关系
4.判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHolder
5.给ViewHolder中的控件设置数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值