內(nèi)存泄漏優(yōu)化---ListView的優(yōu)化

原文鏈接:http://blog.csdn.net/u012810020/article/details/51726990

對于ListView的優(yōu)化主要從三個方面著手:

① 采用ViewHolder避免在getView()方法中執(zhí)行耗時操作;

② 根據(jù)列表的滑動狀態(tài)來控制任務(wù)的執(zhí)行頻率;

③ 嘗試開啟硬件加速來使ListView更加流暢。

1、利用ViewHolder避免在getView()方法中執(zhí)行耗時操作

(1) 創(chuàng)建ViewHolder內(nèi)部類(其實就是自定義的模型類),這樣可以把item中的多個散落的控件整合為一個整體,同時可以避免錯位等問題

(2) 重用convertView,這樣做在很大程度上會減少內(nèi)存的消耗(減少ViewHolder對象實例化的次數(shù)。減少內(nèi)存開銷,提高性能)

(3) 利用convertView的setTag()方法,節(jié)約了執(zhí)行findViewById()的時間,提升了加載速度,節(jié)省了性能的開銷。

示例代碼如下:

[html]view plaincopy

@Override

public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{

ViewHolder?viewHolder;

if?(convertView==?null)?{

viewHolder=newViewHolder();

convertView=inflater.inflate(R.layout.layout_listview_item,?null);

viewHolder.imageView=?(ImageView)?convertView.findViewById(R.id.iv_lv_mainactivity);

viewHolder.textView=?(TextView)?convertView.findViewById(R.id.txt_lv_mainactivity);

convertView.setTag(viewHolder);

}?else?{

viewHolder=?(ViewHolder)?convertView.getTag();

}

MyBeanbean=mList.get(position);

viewHolder.imageView.setImageResource(bean.getImgRes());

viewHolder.textView.setText(bean.getText());

return?convertView;

}

class?ViewHolder?{

ImageView?imageView;

TextView?textView;

}

2、根據(jù)列表的滑動狀態(tài)來控制任務(wù)的執(zhí)行頻率

在ListView快速滑動狀態(tài)時可以采用“懶加載模式”,這樣做不但減少了不斷執(zhí)行異步任務(wù)的開銷,而且提高了界面的流暢度,從而提升了用戶體驗度。

方案:在適配器Adapter中添加判斷是否是“懶加載模式”的標(biāo)識位,從而根據(jù)標(biāo)識位的狀態(tài)采取不同的加載模式。是否采取懶加模式是根據(jù)監(jiān)聽ListView的滑動狀態(tài)。

示例代碼:

①:監(jiān)聽ListView的滑動狀態(tài)

[html]view plaincopy

lv.setOnScrollListener(new?AbsListView.OnScrollListener()?{

@Override

public?void?onScrollStateChanged(AbsListView?view,?int?scrollState)?{

switch?(scrollState)?{

case?AbsListView.OnScrollListener.SCROLL_STATE_FLING:

adapter.setLazyLoadMode(true);

adapter.notifyDataSetChanged();

break;

case?AbsListView.OnScrollListener.SCROLL_STATE_IDLE:

adapter.setLazyLoadMode(false);

adapter.notifyDataSetChanged();

break;

case?AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:

adapter.setLazyLoadMode(false);

adapter.notifyDataSetChanged();

break;

default:

break;

}

}

@Override

public?void?onScroll(AbsListView?view,?int?firstVisibleItem,?int?visibleItemCount,?int?totalItemCount)?{

}

});

② 在Adapter中設(shè)置改變“懶加載標(biāo)識位”的函數(shù),并根據(jù)標(biāo)識位作出相應(yīng)的操作

[html]view plaincopy

/**

*?Created?by?lizhenya.

*/

public?class?MyAdapter?extends?BaseAdapter?{

private?Context?mCtx;

private?ArrayListmList;

private?LayoutInflater?inflater;

private?boolean?isLazyMode;

/**

*?構(gòu)造方法

*

*?@param?context

*?@param?list

*/

public?MyAdapter(Context?context,?ArrayListlist)?{

this.mCtx=context;

this.mList=list;

inflater=LayoutInflater.from(context);

isLazyMode=false;

}

/**

*?方法描述:設(shè)置“懶加載”標(biāo)志位

*

*?@param?isLazy

*/

public?void?setLazyLoadMode(boolean?isLazy)?{

this.isLazyMode=isLazy;

}

@Override

public?int?getCount()?{

returnmList==?null???0?:?mList.size();

}

@Override

public?Object?getItem(int?position)?{

return?mList.get(position);

}

@Override

public?long?getItemId(int?position)?{

return?position;

}

@Override

public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{

ViewHolder?viewHolder;

if?(convertView==?null)?{

viewHolder=newViewHolder();

convertView=inflater.inflate(R.layout.layout_listview_item,?null);

viewHolder.imageView=?(ImageView)?convertView.findViewById(R.id.iv_lv_mainactivity);

viewHolder.textView=?(TextView)?convertView.findViewById(R.id.txt_lv_mainactivity);

convertView.setTag(viewHolder);

}?else?{

viewHolder=?(ViewHolder)?convertView.getTag();

}

MyBeanbean=mList.get(position);

//判斷是否為“懶加載模式”

if?(!isLazyMode)?{

viewHolder.imageView.setImageResource(bean.getImgRes());

viewHolder.textView.setText(bean.getText());

}?else?{

viewHolder.imageView.setImageResource(R.mipmap.loading);

viewHolder.textView.setText("......");

}

return?convertView;

}

static?class?ViewHolder?{

ImageView?imageView;

TextView?textView;

}

}

3、開啟硬件加速來使ListView更加流暢

目前,Android對硬件加速的支持并非完美,有些繪制操作在開啟硬件加速的情況下不能正常工作。具體可參考:http://www.jb51.net/article/79841.htm

代碼資源:ListView的優(yōu)化

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容