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 rawlayout_item.xml hosted with ❤ by GitHub

可以看到,現在設置數據的邏輯 放到該 HolderView 中了, 這樣關於該模塊的功能就集中在一起了,不是散落到 Adapter (或者其他地方) 的 getView 中了。

經過幾個項目的試驗, 個人發現通過 HolderView 可以讓代碼維護起來更加方便,查找起來比較模塊化。

VIA:jayway


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章