標籤:mystra android listview viewholder 最佳化
在Android開發中, ListView是重要的組件, 它以列表形式根據資料的長度, 自適應展示具體內容. 使用者可以自由的定義ListView每一列的布局.
當listview有大量資料需要載入的時候, 會佔據記憶體, 影響效能. 這時候就需要按需填充, 並重新使用View, 減少對象的建立.
ListView載入資料都是在getView()方法中進行. 同時, 需要自訂ListView重寫ListAdapter: 如BaseAdapter, SimpleAdapter, CursorAdapter等.
最佳化ListView載入速度, 要讓convertView匹配清單類型, 並最大程度的重用convertView.
getView()的載入方法一般有以下三種方式:
(1) 最慢的載入方式: 每次都重新定義一個View, 並載入布局再載入資料.
public View getView(int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.layout.list_item_icon_text, null); ((TextView) item.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) item.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return item; }
(2) 較快的載入方式: 當convertView不為空白時, 直接重用convertView, 從而減少不必要的View建立,然後載入資料.
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.item, parent, false); } ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]); ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2); return convertView; }
(3) 最快的較方式: 定義一個ViewHolder,將convetView的tag設定為ViewHolder, 不為空白時重用ViewHolder即可.
static class ViewHolder { TextView text; ImageView icon; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, parent, false); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2); return convertView; }
三種方式的效率對比:
當處理一些耗時的資源載入時, 做到以下幾點, 可使你的載入更快更平滑:
(1) 適配器在介面主線程中進行修改
(2) 可以在任何地方擷取資料但應該在另外一個地方請求資料
(3) 在主介面的線程中提交適配器的變化並調用notifyDataSetChanged()方法(更新資料來源)
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android - ViewHolder最佳化ListView