ViewHolder 模式在 Android 中大家应该都不陌生了,特别是在 ListView 中通过 ViewHolder 来减少 findViewById 的调用和 类型的转换。
而 HolderView 模式是把 ViewHolder 给业务逻辑化,不再仅仅只是保存一些 View, 还要带有业务逻辑。 HolderView 的一个示例如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
import
android.content.Context
;
import
android.content.pm.PackageManager.NameNotFoundException
;
import
android.content.res.Resources.NotFoundException
;
import
android.graphics.drawable.Drawable
;
import
android.os.SystemClock
;
import
android.text.format.DateUtils
;
import
android.util.AttributeSet
;
import
android.widget.ImageView
;
import
android.widget.RelativeLayout
;
import
android.widget.TextView
;
public
class
NotificationLayoutItem
extends
RelativeLayout
{
public
NotificationLayoutItem
(
Context
context
,
AttributeSet
attrs
,
int
defStyle
)
{
super
(
context
,
attrs
,
defStyle
);
}
public
NotificationLayoutItem
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
}
public
NotificationLayoutItem
(
Context
context
)
{
super
(
context
);
}
private
ImageView
mIcon
;
private
TextView
mText
;
private
TextView
mTime
;
@Override
protected
void
onFinishInflate
()
{
super
.
onFinishInflate
();
mIcon
=
(
ImageView
)
findViewById
(
R
.
id
.
notif_icon
);
mText
=
(
TextView
)
findViewById
(
R
.
id
.
notif_text
);
mTime
=
(
TextView
)
findViewById
(
R
.
id
.
notif_time
);
}
// 业务逻辑代码
public
void
setData
(
NotificationData
data
)
{
mText
.
setText
(
data
.
tickerText
);
mTime
.
setText
(
formatTime
(
data
.
time
));
Drawable
icon
;
try
{
icon
=
getContext
().
getPackageManager
().
getResourcesForApplication
(
data
.
packageName
.
toString
()).
getDrawable
(
data
.
icon
);
mIcon
.
setImageDrawable
(
icon
);
}
catch
(
NotFoundException
e
)
{
e
.
printStackTrace
();
}
catch
(
NameNotFoundException
e
)
{
e
.
printStackTrace
();
}
}
private
CharSequence
formatTime
(
long
time
)
{
return
DateUtils
.
formatDateTime
(
getContext
(),
time
,
DateUtils
.
FORMAT_SHOW_TIME
);
}
}
|
1234567891011121314151617181920212223242526272829 |
<?xml version="1.0" encoding="utf-8"?>
<org.goodev.NotificationLayoutItem
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<ImageView
android:id=
"@+id/notif_icon"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_alignParentLeft=
"true"
android:layout_centerVertical=
"true"
/>
<TextView
android:id=
"@+id/notif_time"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_alignParentRight=
"true"
/>
<TextView
android:id=
"@+id/notif_text"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_centerVertical=
"true"
android:layout_toLeftOf=
"@id/notif_time"
android:layout_toRightOf=
"@id/notif_icon"
android:ellipsize=
"none"
android:maxLines=
"2"
/>
</org.goodev.NotificationLayoutItem>
|
可以看到,现在设置数据的逻辑 放到该 HolderView 中了, 这样关于该模块的功能就集中在一起了,不是散落到 Adapter (或者其他地方) 的 getView 中了。
经过几个项目的试验, 个人发现通过 HolderView 可以让代码维护起来更加方便,查找起来比较模块化。
VIA:jayway