listView提供了優化技術
listView每一行顯示的內容是可以複用的,因爲手機的顯示行數是有限的,如果能夠實現行的複用,這樣就可以大大降低手機資源的浪費,從而提高性能.這個技術就是convertview,它實現的原理如下圖:
屏幕只顯示7個item,item1去填充了convertView,把item8的內容加到ListView的底部,並沒有產生更多的行數.從已經顯示的行裏面重複的利用,只是數據是新的.實現的代碼如下:
listview優化技巧:
1、contextview 行佈局複用
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater layoutInflater = getLayoutInflater();
RelativeLayout layout = null;
if(convertView == null)
{
layout = (RelativeLayout) layoutInflater.inflate(R.layout.rela_item, null);
}
else
{
layout = (RelativeLayout) convertView;
}
return layout;
}
2、減少查找次數
a、聲明一個類,用來保存查找到的控件對象
class ViewHolder
{
ImageView p_w_picpathView;
TextView title;
TextView subTitle;
}
b、找創建行佈局對象的同時,創建一個ViewHolder對象,然後查找行佈局對象裏面的控件
並保存到ViewHolder對象裏面。
c、把ViewHolder對象存放到行佈局對象的包裏面
d、在複用行佈局對象的時候,從它裏面獲取ViewHolder對象,繼續使用。
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = getLayoutInflater();
RelativeLayout layout = null;
ViewHolder holder = null;//聲明一個ViewHolder對象
if(convertView == null)
{
layout = (RelativeLayout) layoutInflater.inflate(R.layout.rela_item, null);
holder = new ViewHolder();//創建一個ViewHolder對象
//查找layout裏面的對象,並保存到ViewHolder對象裏面
holder.p_w_picpathView = (ImageView) layout.findViewById(R.id.p_w_picpathView1);
holder.title = (TextView) layout.findViewById(R.id.textView1);
holder.subTitle = (TextView) layout.findViewById(R.id.textView2);
//把ViewHolder對象存放到layout的包裏面
layout.setTag(holder);
}
else
{ //複用layout對象
layout = (RelativeLayout) convertView;
//從layout對象裏面得到ViewHolder對象
holder = (ViewHolder) layout.getTag();
}
//更改ViewHolder對象保存的控件對象的值
holder.p_w_picpathView.setImageResource(p_w_picpath[position]);
holder.title.setText(mTitle.get(position));
holder.subTitle.setText(mSubTitle.get(position));
Log.e("getView", "position:" + position + " layout" + layout );
return layout;
}
3、數據封裝(便於管理數據)
a、聲明一個類,用來保存每一行的數據。
class Dataecapen
{
int imag;
String title;
String subTitle;
public Dataecapen(int imag, String title, String subTitle) {
super();
this.imag = imag;
this.title = title;
this.subTitle = subTitle;
}
}
b、創建這個類對象,把每一行的各個數據保存在對象裏面。
c、聲明一個數組容器保存這個數據對象。(容器要聲明成成員變量)
//爲數組容器添加數據
Dataecapen dataecapen = new Dataecapen(p_w_picpath[i], "title" + i, "subTitle" + i);
arrayList.add(dataecapen);
d、在適配器的getview()裏面,取獲取對應行的數據對象。
獲取數據對象裏面的詳細數據並設置到控件上面。
//從數組容器裏面獲取對應行的數據對象
Dataecapen dataecapen = arrayList.get(position);
holder.p_w_picpathView.setImageResource(dataecapen.imag);
holder.title.setText(dataecapen.title);
holder.subTitle.setText(dataecapen.subTitle);
以上優化的例子和代碼參見附件: