(点击
上方公众号
,可快速关注)
来源:enjoy风铃
链接:www.cnblogs.com/net168/p/4477925.html
如有好文章投稿,请点击 → 这里了解详情
前言
在开发APP的过程中,攻城狮少不了要跟ListView、GridView这些组件眉来眼去,暗送几波秋波。自然原生态美人BaseAdapter更是程序员的最爱,有了它,我们想怎么干就能怎么干,嘿嘿,你懂的O(∩_∩)O哈哈~
但是,每次写一个BaseAdapter,我们都很自觉的给他写一个ViewHolder,一两个还好,万一应用程序中有数不清的ListView,呵呵~你妹!千篇一律,看得都审美疲劳。作为最伟大的第二十二世纪的程序员们,脱掉、搞上永远是我们最真挚的追求,所以我们要怎么将ViewHolder从BaseAdapter中脱掉呢?绝非不是不用,而是要将其搞成一个华丽丽的工具类实现,收入角落那个寂寞得tools类中。
ViewHolder的实现
我觉得应该简略的介绍下ViewHolder的实现,谷歌很聪明的在Adapter中运用了复用View的思想,自然让我们的屌丝机也能泡上一些白富美应用多了一点点可能。ViewHolder的具体实现基本体现在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 的复用,二是 ViewHolder 也就是 convertView 里面的索引的复用。具体的用法不熟悉的话可以百度一下,再往下说就对不起我今天这篇博文了,因为在这里写这个代码的目的,肯定不是介绍你怎么用ViewHolder,只是想告诉你:传统的ViewHolder的写法,是多么的臃肿!而且对于每一个新的BaseAdapter,你都得无聊的实现一次又一次,OH~
ViewHolder的工具类实现
自然,脱光要从小,行动要趁早。既然我们烦了,就把它写成一个工具类咯。参见下面的代码
static
class
ViewHolder
{
public
static
T
extends
View
>
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
;
}
}
这是工具类的实现,稍微说下实现的原理:
1、ViewHolder既然是依赖View的Tag存放,但是以一个 SparseArray 集合存放。
2、判断View里的Tag是否存在viewHolder,不存在,赶紧叫她生一个。
3、然后在viewholder(也就是SparseArray)寻找View的索引,如果没有,赶紧findViewById一个put进去顺便return出来,如果已经存在,皆大欢喜,直接用呗。
贴个BaseAdapter里面使用的代码:
@Override
public
View getView
(
int
position
,
View
convertView
,
ViewGroup
parent
)
{
if