Android - ViewHolder最佳化ListView

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.