您的位置:首页 > 其它

BaseAdapter

2015-09-24 18:51 253 查看

BaseAdapter(数据适配器):降低耦合性,容易扩展





1.ListView的显示和缓存





ListView加载屏幕可以显示的数据,当item滑出屏幕显示区域,系统就会将item回收到Recyler缓存池中,然后从缓存池中取出屏幕将要显示的item,并给其设置数据加载到ListView

数据适配器--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显示的内容

A.逗比式

直接在getView方法中不停的创建新的View,没有利用ListView的缓存机制,浪费资源

代码:



@Override
public View getView(int position, View convertView, ViewGroup parent) {
ApkEntity entity = apk_list.get(position);
View view =inflater.inflate(R.layout.item_layout, null);
TextView name=(TextView)view.findViewById(R.id.apkname);
TextView  des=(TextView)view.findViewById(R.id.apkdes);
TextView info=(TextView)view.findViewById(R.id.apkinfo);
name.setText(entity.getName());
des.setText(entity.getDes());
info.setText(entity.getInfo());
return view;
}


B.普通式

考虑当前创建的convertView是否已经被缓存,如果被缓存就直接拿着convertView用,不用再重新创建View,此时考虑到遍历findViewById会浪费大量时间,依然要进一步优化

代码:



@Override
public View getView(int position, View convertView, ViewGroup parent) {
ApkEntity entity = apk_list.get(position);
if(convertView==null){
convertView =inflater.inflate(R.layout.item_layout, null);
}
TextView name=(TextView)convertView.findViewById(R.id.apkname);
TextView  des=(TextView)convertView.findViewById(R.id.apkdes);
TextView info=(TextView)convertView.findViewById(R.id.apkinfo);
name.setText(entity.getName());
des.setText(entity.getDes());
info.setText(entity.getInfo());
return convertView;
}


C.文艺式

创建内部类ViewHolder,判断convertView是否为空,将View对象的内容封装到ViewHolder中,通过convertView.setTag(holder),建立convertView与ViewHolder的关系,通过convertView.getTag()得到封装好View内容的ViewHolder对象,然后就可以给声明的对象去赋值,避免了重复的findViewById

优点:利用了ListView的缓存机制,通过ViewHolder类实现显示数据视图的缓存,避免多次通过findViewById寻找控件

代码:



@Override
public View getView(int position, View convertView, ViewGroup parent) {
ApkEntity entity = apk_list.get(position);
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=inflater.inflate(R.layout.item_layout, null);
holder.name=(TextView)convertView.findViewById(R.id.apkname);
holder.des=(TextView)convertView.findViewById(R.id.apkdes);
holder.info=(TextView)convertView.findViewById(R.id.apkinfo);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
holder.name.setText(entity.getName());
holder.des.setText(entity.getDes());
holder.info.setText(entity.getInfo());
return convertView;
}

private class ViewHolder {
TextView name;
TextView des;
TextView info;
}


ViewHolder优化BaseAdapter思路:

创建Bean对象,用于封装数据

在构造方法中初始化用于映射的数据List集合

创建ViewHolde类,创建布局映射关系

判断convertView,为空则创建,并设置Tag,否则通过Tag来取出ViewHolder

给ViewHolder中的控件设置数据







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: