新聞中心
前言

在開發(fā)APP的過程中,攻城獅少不了要跟ListView、GridView這些組件眉來眼去,暗送幾波秋波。自然原生態(tài)美人BaseAdapter更是程序員的最愛,有了它,我們想怎么干就能怎么干,嘿嘿,你懂的O(∩_∩)O哈哈~
但是,每次寫一個BaseAdapter,我們都很自覺的給他寫一個ViewHolder,一兩個還好,萬一應(yīng)用程序中有數(shù)不清的ListView,呵呵~你妹!千篇一律,看得都審美疲勞。作為最偉大的第二十二世紀的程序員們,脫掉、搞上永遠是我們最真摯的追求,所以我們要怎么將ViewHolder從BaseAdapter中脫掉呢?絕非不是不用,而是要將其搞成一個華麗麗的工具類實現(xiàn),收入角落那個寂寞得tools類中。
ViewHolder的實現(xiàn)
我覺得應(yīng)該簡略的介紹下ViewHolder的實現(xiàn),谷歌很聰明的在Adapter中運用了復(fù)用View的思想,自然讓我們的屌絲機也能泡上一些白富美應(yīng)用多了一點點可能。ViewHolder的具體實現(xiàn)基本體現(xiàn)在BaseAdapter的 getView(int position, View convertView, ViewGroup parent) 這個方法里面,參見下面的代碼:
- @Override
- public 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 的復(fù)用,二是 ViewHolder 也就是 convertView 里面的索引的復(fù)用。具體的用法不熟悉的話可以百度一下,再往下說就對不起我今天這篇博文了,因為在這里寫這個代碼的目的,肯定不是介紹你怎么用ViewHolder,只是想告訴你:傳統(tǒng)的ViewHolder的寫法,是多么的臃腫!而且對于每一個新的BaseAdapter,你都得無聊的實現(xiàn)一次又一次,OH~
ViewHolder的工具類實現(xiàn)
自然,脫光要從小,行動要趁早。既然我們煩了,就把它寫成一個工具類咯。參見下面的代碼
- static class ViewHolder {
- public static
T get(View view, int id) { - SparseArray
viewHolder = (SparseArray ) view.getTag(); - if (viewHolder == null) {
- viewHolder = new SparseArray
(); - view.setTag(viewHolder);
- }
- View childView = viewHolder.get(id);
- if (childView == null) {
- childView = view.findViewById(id);
- viewHolder.put(id, childView);
- }
- return (T) childView;
- }
- }
這是工具類的實現(xiàn),稍微說下實現(xiàn)的原理:
1、ViewHolder既然是依賴View的Tag存放,但是以一個 SparseArray 集合存放。
2、判斷View里的Tag是否存在viewHolder,不存在,趕緊叫她生一個。
3、然后在viewholder(也就是SparseArray)尋找View的索引,如果沒有,趕緊findViewById一個put進去順便return出來,如果已經(jīng)存在,皆大歡喜,直接用唄。
貼個BaseAdapter里面使用的代碼:
- @Override
- public 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工具類調(diào)用,省心不廢腦。。
分析可行性
既然要作為工具類使用,我們有必要先評估這個工具值不值得我們使用。
一般來說,我們可以從以下幾個方面進行評估:易用性? 內(nèi)存泄露? 性能提升? 健壯性?等等等。。。。。。
易用性:工具類的最大特性就是易用簡約,這個ViewHolder的寫法就是典型的拿來就用的主義,根本不用我們操心寫些適配的代碼,直接傳入View和id,高內(nèi)聚松耦合。并且采用了
內(nèi)存泄露:有些初學(xué)者,看到static方法就回固執(zhí)的認為 SparseArray
性能提升:在這里我們發(fā)現(xiàn)用了 SparseArray 這個集合而不是 HashMap ,我們知道 SparseArray 是Android的一個工具類,是官方推薦用來代替 HashMap
所以,作為一個工具類,它是完全合格的,趕緊把它拷貝到你的tools、util里面,然后我們就可以開心加愉悅的優(yōu)雅用起ViewHolder了。。
網(wǎng)頁題目:值得收藏的ViewHolder工具類實現(xiàn)
URL標題:http://m.fisionsoft.com.cn/article/coepjes.html


咨詢
建站咨詢
