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;
}
这种方法将初始化控件也设置在了只在第一次调用时使用,这用就避免了多次寻找控件初始化的操作,这种方法是这三种方法中优化效果最好,也最推荐使用,因为当运行程序较大时,每一步的优化都尤为关键。
然后就是创建适配器ContactAdapter contactadapter = new ContactAdapter(this, contacts);
最后就是将ListView控件加载到适配器中listView.setAdapter(contactadapter);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。