android應用性能提升之adapter


android應用中用戶滑動list,會回調adapter中的getView方法,這裏不能每個item都去創建一個view,因此需要在getView開始的地方判斷第二個參數view是否爲空。

如果爲空,則需去調用inflate()方法創建新的view,如果不爲空,則直接使用第二個參數view。


好了,如果一個界面有兩個以上的view需要切換,那麼以上提升性能的方式就不正確了。這時需要在adapter中重寫getItemViewType方法和getViewTypeCount方法,

此方法會在getView之前回調,android系統會根據getItemViewType的返回值在getView中返回不一樣的view。


舉個例子:如果一個界面有一個編輯模式和非編輯模式,那麼在adapter中的getViewTypeCount方法中則需直接返回2,表示有兩種模式,而getItemViewType中則

需要判斷當前是那種模式返回不一樣的itemtype,這樣,在getview回調時,會根據不同的type使用不同的view(第二個參數)。


特別提示:getItemViewType中返回的type一定要從0開始計數,否則會報數組越界的異常!

//  定義兩種模式

private final int NORMAL_MODE = 0;
private final int EDITE_MODE = 1;



@Override
public int getViewTypeCount() {
return 2;
}


@Override
public int getItemViewType(int position) {
if (mIsEditeMode) {
return EDITE_MODE;
} else {
return NORMAL_MODE;
}
}


@Override
public View getView(int index, View arg1, ViewGroup arg2) {
View view = null;
int itemType = getItemViewType(index);
if (arg1 == null) {
if (itemType == NORMAL_MODE) {
Log.i("zzzzzz/////", "非編輯模式  爲空");
view = LayoutInflater.from(mContext).inflate(R.layout.list_item_local_info, arg2, false);
} else if (itemType == EDITE_MODE) {
Log.i("zzzzzz/////", "編輯模式  爲空");
view = LayoutInflater.from(mContext).inflate(R.layout.list_item_edite_local_info, arg2, false);
initViewEditeItem(view, e, index);

}
} else {
view = arg1;
if (itemType == NORMAL_MODE) {
Log.i("zzzzzz/////", "非編輯模式  不爲空");
initViewItem(view, e, index);
} else if (itemType == EDITE_MODE) {
Log.i("zzzzzz/////", "編輯模式  不爲空");
initViewEditeItem(view, e, index);
}
}

return view;
}

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