android的ListView入門系列二

listView提供了優化技術

listView每一行顯示的內容是可以複用的,因爲手機的顯示行數是有限的,如果能夠實現行的複用,這樣就可以大大降低手機資源的浪費,從而提高性能.這個技術就是convertview,它實現的原理如下圖:

192621866.png屏幕只顯示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);



以上優化的例子和代碼參見附件:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章