HolderView 与 ViewHolder做Android的伙伴都不会陌生吧,都是为了提升ListView、gridView等这类View的adapter性能,
把多个属性封装到一个类中,也就是面向对象的思想。
ViewHolder实在adapter中建立一个对象,但是没有做任何的业务逻辑,所有的逻辑还是在adapter的getView中实现,这样就显得
adapter特别臃肿。
HolderView就是为了解决adapter的臃肿问题,把逻辑处理方到HolderView中实现,在adapter中只是调用HolderView就ok了
实现代码:
public class HolderView extends GridLayout { private TextView mDigitDigit; private TextView mDigitHex; private TextView mDigitOct; private TextView mDigitEven; private TextView mDigitPrime; private TextView mDigitFibonacci; private String mDigitText; private String mDigitHexText; private String mDigitOctText; private String mDigitEvenText; private String mDigitPrimtText; private String mDigitFibonacciText; public HolderView(Context context) { super(context); initlialize(context); } public HolderView(Context context, AttributeSet attrs) { super(context, attrs); initlialize(context); } public HolderView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initlialize(context); } public void initlialize(Context context) { View v = LayoutInflater.from(context).inflate(R.layout.list_detail, this); mDigitDigit = (TextView) v.findViewById(R.id.list_detail_digit); mDigitHex = (TextView) v.findViewById(R.id.list_detail_digit_hex); mDigitOct = (TextView) v.findViewById(R.id.list_detail_digit_oct); mDigitEven = (TextView) v.findViewById(R.id.list_detail_digit_even); mDigitPrime = (TextView) v.findViewById(R.id.list_detail_digit_prime); mDigitFibonacci = (TextView) v.findViewById(R.id.list_detail_digit_fibonacci); mDigitText = context.getResources().getString(R.string.list_detail_digit); mDigitHexText = context.getResources().getString(R.string.list_detail_digit_hex); mDigitOctText = context.getResources().getString(R.string.list_detail_digit_oct); mDigitEvenText = context.getResources().getString(R.string.list_detail_digit_even); mDigitPrimtText = context.getResources().getString(R.string.list_detail_digit_prime); mDigitFibonacciText = context.getResources().getString(R.string.list_detail_digit_fibonacci); } public void bind(Digit digit) { mDigitDigit.setText(String.format(mDigitText, digit)); mDigitOct.setText(String.format(mDigitOctText, digit.toOctalString())); mDigitHex.setText(String.format(mDigitHexText, digit.toHexString())); mDigitEven.setText(String.format(mDigitEvenText, digit.isEven())); mDigitPrime.setText(String.format(mDigitPrimtText, digit.isPrime())); mDigitFibonacci.setText(String.format(mDigitFibonacciText, digit.isFibonacci())); } }
adapter:
public class ItemAdapter extends BaseAdapter { private final Context mContext; private int count = 256; public ItemAdapter(Context context) { mContext = context; } @Override public int getCount() { return count; } @Override public Object getItem(int i) { return i; } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { HolderView holderView; // Important to not just null check, but rather to a instanceof // since we might get any subclass of view here. if (convertView instanceof HolderView) { holderView = (HolderView) convertView; } else { holderView = new HolderView(mContext); } holderView.bind(new Digit(i)); return holderView; } }
list_dateil.xml
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" > <TextView android:id="@+id/list_detail_digit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="0" android:layout_gravity="left|top" android:layout_row="0" android:padding="8dip" /> <TextView android:id="@+id/list_detail_digit_oct" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="1" android:layout_gravity="left|top" android:layout_row="0" android:padding="8dip" /> <TextView android:id="@+id/list_detail_digit_hex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="2" android:layout_gravity="left|top" android:layout_row="0" android:padding="8dip" /> <TextView android:id="@+id/list_detail_digit_even" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="0" android:layout_gravity="left|top" android:layout_row="1" android:padding="8dip" /> <TextView android:id="@+id/list_detail_digit_prime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="1" android:layout_gravity="left|top" android:layout_row="1" android:padding="8dip" /> <TextView android:id="@+id/list_detail_digit_fibonacci" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="2" android:layout_gravity="left|top" android:layout_row="1" android:padding="8dip" /> </merge>
HolderView vs ViewHolder实例,布布扣,bubuko.com
原文:http://blog.csdn.net/honjane/article/details/23663189