Android中的万能适配器——base-adapter-helper解析

Posted DroidMind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的万能适配器——base-adapter-helper解析相关的知识,希望对你有一定的参考价值。

android开发中,我们经常会用到ListView、GridView,每次编码的时候都需要为他们写对应的Adapter,写多了就感觉很烦躁了,因为基本的编程思想都是一样的,但是每次都要重复去写,所以我们能不能把它们抽象成一个通用的模板,这样就不用每次都重复写相同的代码了,直接重复使用,这样不是更好,下面我们就来介绍介绍一个开源项目base-adapter-helper。

传统Adapter的编码思路,主要看Adapter中的getView方法。

public View getView(int pos, View convertView, ViewGroup parent){ 
    ViewHolder holder; 
    if (convertView == null) { 
        convertView = mInflater.inflate(R.layout.list_item, null); 
        holder = new ViewHolder();  
        holder.text = (TextView) convertView.findViewById(R.id.text)); 
        holder.icon = (ImageView) convertView.findViewButId(R.id.icon)); 
        convertView.setTag(holder); 
    } else { 
        holder = (ViewHolder) convertView.getTag(); 
    }  
    holder.text.setText(DATA[pos]); 
    holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2); 
    return convertView; 
}

static class ViewHolder { 
    TextView text; 
    ImageView icon; 
}

上面使用了一个ViewHolder用来缓存对应Item中的view,并且重用移出的Item,它对应的就是convertView。这样注意为了节省资源,提高效率。这种写法大家都应该很熟悉了。
下面来看看base-adapter-helper是怎样对其进行抽象封装的。首先来看看它的类继承图。

github链接:base-adapter-helper


可以看到BaseQuickAdapter继承自BaseAdapter,同样我们重点关注它的getView函数。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (getItemViewType(position) == 0) {
        final H helper = getAdapterHelper(position, convertView, parent);
        T item = getItem(position);
        helper.setAssociatedObject(item);
        convert(helper, item);
        return helper.getView();
    }

    return createIndeterminateProgressView(convertView, parent);
}

private View createIndeterminateProgressView(View convertView, ViewGroup parent) {
    if (convertView == null) {
        FrameLayout container = new FrameLayout(context);
        container.setForegroundGravity(Gravity.CENTER);
        ProgressBar progress = new ProgressBar(context);
        container.addView(progress);
        convertView = container;
    }
    return convertView;
}

下面我们分析分析getView的代码:

  • 第3行代码就是获取该postion的Item类型,上面定义了两种类型的Item,一种是我们需要显示的View的Item,一种是底部的加载的View的Item。当Item类型为0是就为需要显示的Item,当Item类型为1是就为底部加载的Item,上面的第11行代码的createIndeterminateProgressView就是创建底部用来的加载的Item,可以看到它是一个ProgressBar。另外可以通过showIndeterminateProgress(boolean)来显示或者隐藏这个item。