需求分析:适配器常用的LayoutInflater.inflate()方法,转化资源文件,执行一次,极耗资源。每次加载页面都要重新调用,未免太过浪费。
解决思路:利用ViewHolder来缓存必要的资源,减少inflate的调用次数,从而节省资源。
关键步骤分析:
1.利用内部类ViewHolder缓存资源,再将ViewHolder中的资源,存放在convertView的Tag中(C#中的winForm程序也经常这么做,异曲同工)。
2.在getview()方法中,增加对convertView的判断,若已经初始化过,则直接从缓存convertView中的Tag取资源即可,而非每次都inflate()转化一次。
适配器代码:
public class LvAdapter extends BaseAdapter {
private LayoutInflater mLayoutInflater;
// 映射数据<泛型bean>
private List<ItemBean> mDataList;
public LvAdapter(Context context, List<ItemBean> list) {
mLayoutInflater = LayoutInflater.from(context);
mDataList = list;
}
// 获取数据量
@Override
public int getCount() {
return mDataList.size();
}
// 获取对应ID项对应的Item
@Override
public Object getItem(int position) {
return mDataList.get(position);
}
// 获取对应项ID
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//用viewholder 储存 findviewbyid的值,避免重复,提高了效率。
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
// 只将XML转化为View,不涉及具体布局,第二个参数设null
convertView = mLayoutInflater.inflate(R.layout.lv_item_menu, null);
holder.img = (ImageView) convertView.findViewById(R.id.lv_img);
holder.title = (TextView) convertView.findViewById(R.id.lv_title);
holder.content = (TextView) convertView
.findViewById(R.id.lv_content);
//用tag储存viewholder,从而使convertView与holder关联
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 取出bean对象
ItemBean bean = mDataList.get(position);
// 设置控件的数据
holder.img.setImageResource(bean.itemImageResid);
holder.title.setText(bean.itemTitle);
holder.content.setText(bean.itemContent);
return convertView;
}
// ViewHolder用于缓存控件
class ViewHolder {
public ImageView img;
public TextView title;
public TextView content;
}
}
把用到的javabean,也发一下,方便读
public class ItemBean {
public int itemImageResid;
public String itemTitle;
public String itemContent;
public String url;
public ItemBean(int itemImageResid, String itemTitle,String url) {
this.itemImageResid = itemImageResid;
this.itemTitle = itemTitle;
this.url = url;
}
public int getItemImageResid() {
return itemImageResid;
}
public void setItemImageResid(int itemImageResid) {
this.itemImageResid = itemImageResid;
}
public String getItemTitle() {
return itemTitle;
}
public void setItemTitle(String itemTitle) {
this.itemTitle = itemTitle;
}
public String getItemContent() {
return itemContent;
}
public void setItemContent(String itemContent) {
this.itemContent = itemContent;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}