摘用别人的,谢谢作者
Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter) ),列表的每一项会显示至页面中。其实,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View,如: @Override public View getView(int position, View convertView, ViewGroup parent) { return super.getView(position, convertView, parent); } 我们看一看下面的这段代码: public View getView(int position, View convertView, ViewGroup parent) { View newView = mInflater.inflate(R.layout.list_item, null); ((TextView) newView .findViewById(R.id.text)).setText(DATA[position]); ((ImageView) newView .findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return newView ; } 上面的代码块中,我通过LayoutInflater.inflate(,)将Layout文件–layout.list_item转换为View. (注:Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById()) 这时,如果我的ITEM项有数以千条这样多或更多呢,再以上面代码块的写法,后果自己想想吧。
于是,改用其它一种写法: public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item, null); } ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return convertView; } 这时,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。 到这里,问一下,还有没有优化的方法呢,是有的,请看————》》: public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); return convertView; }
static class ViewHolder { TextView text; ImageView icon; } 这样系统性能会得到更大的提升。 希望可能帮助到大家。这也是平时面试当中面试官经常会问到的”ListView的优化”的问题。