BaseAdapter

来源:互联网 发布:java random.nextint 编辑:程序博客网 时间:2024/05/19 14:51


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的缓存机制,浪费资源

代码:

@Overridepublic 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会浪费大量时间,依然要进一步优化

代码:

@Overridepublic 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寻找控件

代码:

@Overridepublic 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中的控件设置数据




0 0