ListView在安卓开发中,是经常需用使用的控件,而用这个控件,就离不开它的数据绑定,这时候Adapter(数据适配器)就起了很大作用
成都创新互联公司专注于企业成都营销网站建设、网站重做改版、揭西网站定制设计、自适应品牌网站建设、HTML5建站、电子商务商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为揭西等各大城市提供网站开发制作服务。在学习了多种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);
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。