我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter。
BaseAdapter
使用BaseAdapter比较简单,主要是通过继承此类来实现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的显示内容。
前三种方法比价简单,getview()比较复杂,下面说一下,一般有三种方法:
第一种(没有利用到优化机制,效率很低,不推荐使用):
public View getView(int position, View convertView, ViewGroup parent) { View view=minflater.inflate(R.layout.item,null); ImageView imageView=(ImageView) view.findViewById(R.id.image); TextView title=(TextView) view.findViewById(R.id.title); TextView content=(TextView) view.findViewById(R.id.content); ItemBean bean=mlist.get(position); imageView.setImageResource(bean.imageid); title.setText(bean.title); content.setText(bean.content); return view; }
这种方式每次调用getView时都是通过inflate创建一个新的View对象,然后在此view中通过findViewById找到对应的控件。、
第二种(优化版):
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.item,null); }//找到item布局文件中对应的控件 ImageView imageView = (ImageView) convertView.findViewById(R.id.image); TextView titleTextView = (TextView) convertView.findViewById(R.id.title); TextView contentTextView = (TextView) convertView.findViewById(R.id.content); //获取相应索引的ItemBean对象
ItemBean bean = mList.get(position); // 设置控件的对应属性值 imageView.setImageResource(bean.itemImageResId); titleTextView.setText(bean.itemTitle); contentTextView.setText(bean.itemContent); return convertView; }
这种方式利用了ListView的缓存机制,但是在ListView很复杂是,需要的时间仍然很多。
第三中(优优化版):
//文艺式 /*利用ViewHolder优化BaseAdapter思路: 1.创建Bean对象,用于封装数据 2.在构造方法中初始化用于映射的数据List 3.创建ViewHolder类,创建布局映射关系 4.判断convertView,为空则创建,并设置tag;否则通过tag来取出viewholder 5.给viewholder中的空间设置数据*/ ViewHolder viewHolder; if(convertView==null){ convertView=minflater.inflate(R.layout.item,null); viewHolder=new ViewHolder(); viewHolder.imageView=(ImageView)convertView.findViewById(R.id.image); viewHolder.title=(TextView)convertView.findViewById(R.id.title); viewHolder.content=(TextView)convertView.findViewById(R.id.content); convertView.setTag(viewHolder); }else{ viewHolder=(ViewHolder) convertView.getTag(); } ItemBean bean=mlist.get(position); viewHolder.imageView.setImageResource(bean.imageid); viewHolder.title.setText(bean.title); viewHolder.content.setText(bean.content); return convertView; } class ViewHolder{ public ImageView imageView; public TextView title; public TextView content; }
这种方法尽量避免了,findview()的使用,因此哪怕在Listview很复杂的时候也有不错的效率,因此推荐使用。