`
yanfaguanli
  • 浏览: 655407 次
文章分类
社区版块
存档分类
最新评论

HolderView vs ViewHolder实例

 
阅读更多

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>



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics