編輯:關於Android編程
標簽(空格分隔): Android基礎入門教程
上一節中我們學習了如何來使用一個ListView以及自定義一個簡單的BaseAdapter,我們從代碼
中可以看出比較重要的兩個方法:getCount()和getView(),界面上有多少列就會調用多少次getView,
這個時候可能看出一些端倪,每次都是新inflate一個View,都要進行這個XML的解析,這樣會
很浪費資源,當然,幾十列或者幾百列的列表並不能體現什麼問題,但假如更多或者布局更加復雜?
所以學習ListView的優化很重要,而本節針對的是BaseAdapter的優化,優化的兩點有,復用convertView
以及使用ViewHolder重用組件,不用每次都findViewById,我們具體通過代碼來體會吧!
上面也說了,界面上有多少個Item,那麼getView方法就會被調用多少次!
我們來看看上一節我們寫的getView()部分的代碼:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
是吧,inflate()每次都要加載一次xml,其實這個convertView是系統提供給我們的可供服用的View
的緩存對象,那就坐下判斷咯,修改下,優化後的代碼:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
}
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
嘿嘿,getView()會被調用多次,那麼findViewById不一樣得調用多次,而我們的ListView的Item
一般都是一樣的布局,我們可以對這裡在優化下,我們可以自己定義一個ViewHolder類來對這一部分
進行性能優化!修改後的代碼如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
holder = new ViewHolder();
holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
holder.txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
convertView.setTag(holder); //將Holder存儲到convertView中
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.img_icon.setBackgroundResource(mData.get(position).getaIcon());
holder.txt_aName.setText(mData.get(position).getaName());
holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
static class ViewHolder{
ImageView img_icon;
TextView txt_aName;
TextView txt_aSpeak;
}
沒錯就是這麼簡單,你以後BaseAdapter照著這個模板寫就對了,哈哈,另外這個修飾ViewHolder的
static你可以看情況改成其他的,如果條目較少的話,可以使用static,如果條目多的花,還是別
定義成靜態的~
好的,關於BaseAdapter的優化大概就上述的兩種,非常簡單,復用ConvertView以及自定義ViewHolder
減少findViewById()的調用~如果你有其他關於BaseAdapter優化的建議歡迎提出,謝謝~
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
IntentService是Android中提供的後台服務類,我們在外部組件中通過Intent向IntentService發送請求命令,之後IntentService逐
前言什麼是NDK?NDK全稱是Native Development Kit,NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應
一、背景Xposed,大名鼎鼎得Xposed,是Android平台上最負盛名的一個框架。在這個框架下,我們可以加載很多插件App,這些插件App可以直接或間接操縱系統層面
Android-使用WebView顯示網頁WebView是安卓提供顯示web界面的工具類,可以像PC端的浏覽器那樣進行顯示:大致就是上圖那樣。其實也可以不用WebView