),列表的每一項會顯示至頁面中。其實,當列表里的每一項顯示到頁面時,都會調用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的優化”的問題。