Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android - ViewHolder優化ListView

Android - ViewHolder優化ListView

編輯:關於Android編程

在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()方法(更新數據源)

版權聲明:本文為博主原創文章,未經博主允許不得轉載。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved