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