Android开发中经常用到ViewHolder类来进行ListView的缓存,每次都是在Adapter里面写ViewHolder比较麻烦,虽然有ButterKnife可以快速获取View,但是可复用性太差.

查找了网上的一些代码,结合自己目前的需要,写了一个目前项目中使用的ViewHolder,代码如下:

/**
 * 通用的ViewHolder
 * Created by Administrator on 2016/1/18 0018.
 */
public class ViewHolder {

    private View convertView;
    private SparseArray<View> views;

    private ViewHolder(Context context, ViewGroup parent, int layoutId){
        this.views = new SparseArray<>();
        convertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        convertView.setTag(this);
    }

    /**
     * 获取ViewHolder实例
     * @param context 上下文
     * @param convertView item的根view
     * @param parent 父类容器
     * @param layoutId item布局资源文件id
     * @return ViewHolder实例
     */
    public static ViewHolder getHolder(Context context, View convertView, ViewGroup parent, int layoutId){
        if (convertView == null){
            return new ViewHolder(context, parent, layoutId);
        }
        return (ViewHolder) convertView.getTag();
    }

    /**
     * 获取View
     * @param id view的id
     * @param <T> View的实际类型
     * @return
     */
    public <T extends View> T get(int id) {
        View childView = views.get(id);
        if (childView == null) {
            childView = convertView.findViewById(id);
            views.put(id, childView);
        }
        return (T) childView;
    }

    /**
     * 获取item布局的根View
     * @return
     */
    public View getConvertView(){
        return convertView;
    }

目前该ViewHolder比较简单,后续需要在做优化.


重要说明

想随时获取最新博客文章更新,请关注公共账号DevWiki,或扫描下面的二维码:

微信公共号