BaseAdapter(基础适配器):继承它必须实现下面的四个方法
- 1:public int getCount():适配器中数据集中数据的个数
- 2:public Object getItem(int i):获取数据集中与指定索引对应的数据项
- 3:public long getItemId(int i):获取指定行对应的ID
- 4:public View getView(int i, View view, ViewGroup viewGroup):获取每一个Item的显示内容,这算是最重要的方法
主要点在于getView()方法中,它是将获取数据后的View组件返回.在此方法中优化性能
- 假设现在有一个简单的listView的简单布局,就一个ImageView与两个TextView
//list_item布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/list_image"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/list_title"
android:layout_toRightOf="@id/list_image"
android:layout_width="match_parent" android:layout_height="30dp"
android:text="Tiltle"
android:gravity="center"
android:textSize="25sp"/>
<TextView
android:layout_below="@id/list_title"
android:layout_toRightOf="@id/list_image" android:id="@+id/list_content" android:layout_width="match_parent" android:layout_height="wrap_content"
android:text="content"
android:gravity="center_vertical"
android:textSize="20sp" />
</RelativeLayout>
- ItemBean类
public class ItemBean {
public int ItemImageResid;
public String Itemtitle;
public String ItemContent;
/**
* 构造方法
* @param itemImageResid 图片ID
* @param itemtitle 标题
* @param itemContent 内容
*/
public ItemBean(int itemImageResid, String itemtitle, String itemContent) {
ItemImageResid = itemImageResid;
Itemtitle = itemtitle;
ItemContent = itemContent;
}}
- 自定义BaseAdapter
第一重境界:初学境界也就是逗逼境界,绝对不要这样子使用,此法子在每次都重新创建创建一个View,完全没有使用到ListView的缓存机制.太浪费
public class MyBaseAdapter extends BaseAdapter {
private List<ItemBean> mList;
private LayoutInflater mInflater;
private long mSumTime;
public MyBaseAdapter(Context context, List<ItemBean> list){
mList = list;
mInflater = LayoutInflater.from(context);
}
/**
* 数据个数
* @return
*/
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int i) {
return mList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
//第一种方式(逗逼式,不建议使用,完全没有利用到ListView的缓存机制,此方法调用非常的频繁)
View view1 = mInflater.inflate(R.layout.list_item,null);
ImageView icon = (ImageView) view1.findViewById(R.id.list_image);
TextView title = (TextView) view1.findViewById(R.id.list_title);
TextView content = (TextView) view1.findViewById(R.id.list_content);
//模型类
ItemBean bean = mList.get(i);
icon.setImageResource(bean.ItemImageResid);
title.setText(bean.Itemtitle);
content.setText(bean.ItemContent);
return view1;
}
第二重境界:普通式,加一句判断View是否为空,空则创建,保证了只创建一次,简单利用了缓存机制,但是它View的控件还是每次都使用findViewById来寻找控件,也是非常耗费时间的.这个法子也不最好不要使用,因为还有更好的选择
public View getView(int i, View view, ViewGroup viewGroup) {
//普通式,避免重复创建View,利用了ListView的缓存特性,但是findViewById依然会浪费大量时间
if (view == null){//先判断View是否为空,为空则表示缓存池中无缓存
view = mInflater.inflate(R.layout.list_item,null);
}
ImageView icon = (ImageView) view.findViewById(R.id.list_image);
TextView title = (TextView) view.findViewById(R.id.list_title);
TextView content = (TextView) view.findViewById(R.id.list_content);
ItemBean bean = mList.get(i);
icon.setImageResource(bean.ItemImageResid);
title.setText(bean.Itemtitle);
content.setText(bean.ItemContent);
return view;
}
第三重境界:也是目前推荐的方法,省去了每次都使用findViewById去寻找控件
/** viewHolder优化BaseAdapter思路
* 1:创建Bean对象,用于封装数据
* 2:在构造方法中初始化用于映射的数据List
* 3:创建viewHolder类,创建布局映射对象
* 4:判断convertView,为空则创建,并设置Tag,通过Tag取出ViewHolder
* 5:给ViewHolder中的控件设置数据
* 总结:不要使用逗逼式,绝对不要使用,绝对不要使用
* */
//内部类,声明我们需要显示的控件,避免重复的findViewById
class viewHolder{
public ImageView imageView;
public TextView title;
public TextView content;
}
public View getView(int i, View view, ViewGroup viewGroup) {
//文艺式:不仅利用了ListView的缓存,更通过ViewHolder类来实现显示数据的视图的缓存,避免多次通过findViewById寻找控件,利用此方法更好点
viewHolder viewHolder;
if (view == null){//判断view是否为空
viewHolder = new viewHolder();
view = mInflater.inflate(R.layout.list_item,null);
//将ViewHolder中的控件保存起来
viewHolder.imageView = (ImageView) view.findViewById(R.id.list_image);
viewHolder.title = (TextView) view.findViewById(R.id.list_title); viewHolder.content = (TextView) view.findViewById(R.id.list_content);
//通过setTag将ViewHolder于view绑定
view.setTag(viewHolder);
}else {
//通过getTag()取出关联的ViewHolder
viewHolder = (viewHolder) view.getTag();
}
//赋值
ItemBean bean = mList.get(i);
viewHolder.imageView.setImageResource(bean.ItemImageResid);
viewHolder.title.setText(bean.Itemtitle);
viewHolder.content.setText(bean.ItemContent);
return view;
}