ListView在安卓开发中,是经常需用使用的控件,而用这个控件,就离不开它的数据绑定,这时候Adapter(数据适配器)就起了很大作用

在学习了多种Adapter(适配器之后),感觉比较常用的三种就是ArrayAdapter和SimpleAdapter以及BaseAdapter.

ArrayAdapter用法最为简单,但功能较为单一,一般只能显示简单的文本信息。

SimpleAdapter有所提升,能通过自己编写一个布局来显示图像和文本,但缺点在于模板单一,只能使用固定的1个模板

而BaseAdapter(基础适配器)则最为自由,可以通过重写方法来实现自己想要的各种的布局,但是难度较大,接下来将浅谈一下自己对BaseAdapter的使用及优化方法。

要使用BaseAdapter,先写一个class类继承BaseAdapter,并实现其方法,方法如下

getCount()为获取数据条目的数量,返回值也就是数据条目的数量(这个返回值数据条目的数量一定要写)、getItem()为获取对应ID项对应的Item(可以不用管)、getItemId()为获取对应项ID(也可以不用管),最后一个方法最为重要也就是getView(int position,View covertView,ViewGroup arg2),重写的主要是这个方法

事先准备如下其中context为上下文,List<...>集合可以根据自己需要用泛型来规定自己的数据,这里只是简单例子

接下来就开始重写getView(...)方法,步骤主要分为:

第一种写法:

// 获取纳秒时间 更加精确

long start = System.nanoTime();

// 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View view = inflater.inflate(R.layout.item, null);

// 实例化控件(这些控件为自己在根据需要在布局中加的控件)

ImageView itemImage = (ImageView) view.findViewById(R.id.iv_p_w_picpath);

TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);

TextView itemContent = (TextView) view.findViewById(R.id.tv_content);

// 取出contact对象

Contact contact = contacts.get(position);

// 设置控件的数据

itemImage.setImageResource(contact.itemImageResid);

itemTitle.setText(contact.itemTitle);

itemContent.setText(contact.itemContent);

//记录时间

long end = System.nanoTime();

long dValue = end - start;

mSumTime += dValue;

// 输出每次getView消耗的时间和

Log.d("ATG", String.valueOf(mSumTime));

return view;

这种方法最基础,也最耗时,原因是函数没被调用一次,所有步骤都要执行一次,实际上有些步骤或控件是可以重用的。

第二种改良方法:

// 获取纳秒时间 更加精确

// long start = System.nanoTime();

// 当第一次调用该方法是,才需要将布局模块转为View对象,其它时候不需要了

// if (convertView == null) {

// LayoutInflater inflater = LayoutInflater.from(context);

// convertView = inflater.inflate(R.layout.item, null);

// }

// ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);

// TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);

// TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);

// // 取出contact对象

// Contact contact = contacts.get(position);

// 设置控件的数据

// itemImage.setImageResource(contact.itemImageResid);

// itemTitle.setText(contact.itemTitle);

// itemContent.setText(contact.itemContent);

// long end = System.nanoTime();

// long dValue = end - start;

// mSumTime += dValue;

// 输出每次getView消耗的时间和

// Log.d("ATG", String.valueOf(mSumTime));

// return convertView;

这种方法将无谓的重复的吧布局模块转为View对象的步骤简化

第三种方法:

// 获取纳秒时间 更加精确

// long start = System.nanoTime();

// ViewHolder holder = null;

// if (convertView == null) {

// holder = new ViewHolder();

// LayoutInflater inflater = LayoutInflater.from(context);

// convertView = inflater.inflate(R.layout.item, null);

// holder.img = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);

// holder.title = (TextView) convertView.findViewById(R.id.tv_title);

// holder.content = (TextView) convertView.findViewById(R.id.tv_content);

// convertView.setTag(holder);

// } else {

// holder = (ViewHolder) convertView.getTag();

// }

// 取出contact对象

// Contact contact = contacts.get(position);

// 设置控件的数据

// holder.img.setImageResource(contact.itemImageResid);

// holder.title.setText(contact.itemTitle);

// holder.content.setText(contact.itemContent);

// long end = System.nanoTime();

// long dValue = end - start;

// mSumTime += dValue;

// 输出每次getView消耗的时间和

// Log.d("ATG", String.valueOf(mSumTime));

// return convertView;

}

// ViewHolder用于缓存控件

class ViewHolder{

public ImageView img;

public TextView title;

public TextView content;

}

这种方法将初始化控件也设置在了只在第一次调用时使用,这用就避免了多次寻找控件初始化的操作,这种方法是这三种方法中优化效果最好,也最推荐使用,因为当运行程序较大时,每一步的优化都尤为关键。

然后就是创建适配器ContactAdaptercontactadapter = new ContactAdapter(this, contacts);

最后就是将ListView控件加载到适配器中listView.setAdapter(contactadapter);