原文鏈接: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)化