Android應用系列:值得收藏的ViewHolder工具類實現

來源:互聯網
上載者:User

標籤:

前言

  在開發APP的過程中,攻城獅少不了要跟ListView、GridView這些組件眉來眼去,暗送幾波秋波。自然原生態美人BaseAdapter更是程式員的最愛,有了它,我們想怎麼幹就能怎麼幹,嘿嘿,你懂的O(∩_∩)O哈哈~

  但是,每次寫一個BaseAdapter,我們都很自覺的給他寫一個ViewHolder,一兩個還好,萬一應用程式中有數不清的ListView,呵呵~你妹!千篇一律,看得都審美疲勞。作為最偉大的第二十二世紀的程式員們,脫掉、搞上永遠是我們最真摯的追求,所以我們要怎麼將ViewHolder從BaseAdapter中脫掉呢?絕非不是不用,而是要將其搞成一個華麗麗的工具類實現,收入角落那個寂寞得tools類中。

ViewHolder的實現

  我覺得應該簡略的介紹下ViewHolder的實現,Google很聰明的在Adapter中運用了複用View的思想,自然讓我們的屌絲機也能泡上一些白富美應用多了一點點可能。ViewHolder的具體實現基本體現在BaseAdapter的 getView(int position, View convertView, ViewGroup parent) 這個方法裡面,參見下面的代碼:

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {    ViewHolder holder;    if (convertView == null) {        convertView = inflater.inflate(R.layout.listview_item_layout, parent, false);        holder = new ViewHolder();        holder.studentName = (TextView) convertView.findViewById(R.id.student_name);        holder.studentAge = (TextView) convertView.findViewById(R.id.student_age);        convertView.setTag(holder);    }    else {        holder = (ViewHolder) convertView.getTag();    }    Student data = (Student) getItem(position);    holder.studentName.setText(data.getName());    holder.studentAge.setText(data.getAge());    return convertView;}class ViewHolder {    public TextView studentName;    public TextView studentAge;}

 

很明顯,大家不要問我ViewHolder在哪裡,稍微把目光往上扶一扶就看到那個大大的  class ViewHolder 。這裡的ViewHolder用法主要有兩個地方,一是 convertView 的複用,二是 ViewHolder 也就是 convertView 裡面的索引的複用。具體的用法不熟悉的話可以百度一下,再往下說就對不起我今天這篇博文了,因為在這裡寫這個代碼的目的,肯定不是介紹你怎麼用ViewHolder,只是想告訴你:傳統的ViewHolder的寫法,是多麼的臃腫!而且對於每一個新的BaseAdapter,你都得無聊的實現一次又一次,OH~

ViewHolder的工具類實現

自然,脫光要從小,行動要趁早。既然我們煩了,就把它寫成一個工具類咯。參見下面的代碼

static class ViewHolder {    public static <T extends View> T get(View view, int id) {        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();        if (viewHolder == null) {            viewHolder = new SparseArray<View>();            view.setTag(viewHolder);        }        View childView = viewHolder.get(id);        if (childView == null) {            childView = view.findViewById(id);            viewHolder.put(id, childView);        }        return (T) childView;    }}

這是工具類的實現,稍微說下實現的原理:

1、ViewHolder既然是依賴View的Tag存放,但是以一個 SparseArray 集合存放。

2、判斷View裡的Tag是否存在viewHolder,不存在,趕緊叫她生一個。

3、然後在viewholder(也就是SparseArray)尋找View的索引,如果沒有,趕緊findViewById一個put進去順便return出來,如果已經存在,皆大歡喜,直接用唄。

貼個BaseAdapter裡面使用的代碼:

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {    if (convertView == null) {        convertView = inflater.inflate(R.layout.listview_item_layout, parent, false);    }    TextView name = Tools.ViewHolder.get(convertView, R.id.student_name);    TextView age = Tools.ViewHolder.get(convertView, R.id.student_age);        Student data = (Student) getItem(position);    name.setText(data.getName());    age.setText(data.getAge());        return convertView;}

 簡潔明了,不用多說~~~嘿嘿,後面如果要寫ViewHolder,直接Tools工具類調用,省心不廢腦。。

分析可行性

既然要作為工具類使用,我們有必要先評估這個工具值不值得我們使用。

一般來說,我們可以從以下幾個方面進行評估:易用性? 記憶體泄露? 效能提升? 健壯性?等等等。。。。。。

 

易用性:工具類的最大特性就是易用簡約,這個ViewHolder的寫法就是典型的拿來就用的主義,根本不用我們操心寫些適配的代碼,直接傳入View和id,高內聚松耦合。並且採用了<T extends View> T的泛型模板的方法,自動與外部的View子類適配,不用我們手動去強制裝換。

記憶體泄露:有些初學者,看到static方法就回固執的認為 SparseArray<View> viewHolder 這個變數會存在記憶體泄露,但是java告訴我們,這個變數的小命僅僅在方法執行之中,方法完畢,GC回收;存在ViewHolder一如既往放在View的Tag中,一旦View被回收,ViewHolder自然消失。不信,開啟DDMS,用你28青年的手速不停刷listView試試,保證對象基本穩定在一個值。

效能提升:在這裡我們發現用了 SparseArray 這個集合而不是 HashMap ,我們知道 SparseArray 是Android的一個工具類,是官方推薦用來代替 HashMap<Integer,E> 的一個類,它的內部採用了二分尋找的實現提高了尋找效率,而且不是一點兩點的哦,誰用誰知道;具體內容想要瞭解,可以度娘穀哥或者左轉源碼。

 

所以,作為一個工具類,它是完全合格的,趕緊把它拷貝到你的tools、util裡面,然後我們就可以開心加愉悅的優雅用起ViewHolder了。。

 

 

enjoy風鈴
出處:http://www.cnblogs.com/net168/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則下次不給你轉載了。

Android應用系列:值得收藏的ViewHolder工具類實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.