ViewHolder VS HolderView ?

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>
view raw layout_item.xml hosted with ❤ by  GitHub

可以看到,现在设置数据的逻辑 放到该 HolderView 中了, 这样关于该模块的功能就集中在一起了,不是散落到 Adapter (或者其他地方) 的 getView 中了。

经过几个项目的试验, 个人发现通过 HolderView 可以让代码维护起来更加方便,查找起来比较模块化。

VIA:jayway


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值