Android中Listview适配器的优化写法

需求分析:适配器常用的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;
	}

}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值