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>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值