首页 > 代码库 > ViewHolder模式简洁写法

ViewHolder模式简洁写法

参考网址:
http://blog.csdn.net/hmily7532361/article/details/18368235

    在安卓中 自定义Adapter时,使用ViewHolder可缓存每个Item的View,减少一些不必要的操作,提高性能。在网上看到一种比较简洁的写法,避免每个自定义的Adapter定义ViewHolder实体类。


import android.util.SparseArray;
import android.view.View;
/**
 * 
 * @类名 ViewHolderUtils
 * @功能描述 数据源 Adapter 中 优化 控件 获取 辅助类
 * @作者 2014-5-19 / 郝志东
 * @备注 <对应的分析文档、设计文档或其他备注说明>
 * @修改记录 
 *     R1:
 *         修改作者:修改日期 / 修改人员姓名
 *         修改理由:
 */
public class ViewHolderUtils {
    /**
     * 增加一个私有构造函数防止外部实例化
     */
    private ViewHolderUtils() {
    }
    /**
     * 
      * @功能 从缓存中 获取 View 控件 对象,如果不存在缓存就初始化后放入缓存,以备下次使用;
      *  知识点: Android应用性能优化之使用SparseArray替代HashMap;
      * @param view 当前Item 布局 View
      * @param id 当前Item中 某个View 的id值
      * @return  当前Item中对应id的View对象
      * @作者 2014-5-19 / 郝志东
     */
    public static <T extends View> T get(View view, int id) {
        SparseArray<View> viewHodler = (SparseArray<View>) view.getTag();
        if (viewHodler == null) {
            viewHodler = new SparseArray<View>();
            view.setTag(viewHodler);
        }
        View childView = viewHodler.get(id);
        if (childView == null) {
            childView = view.findViewById(id);
            viewHodler.put(id, childView);
        }
        return (T) childView;
    }
}


在自定义的Adapter中getView函数中调用方式如下:
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {
            if (mInflater == null) {
                mInflater = LayoutInflater.from(mContext);
            }
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.item_listview_healtheducation, parent, false);
        }
        // 从 缓冲 中 获取 TextView 对象
        TextView titleView = ViewHolderUtils.get(convertView,
                R.id.tv_item_healtheducation);
        ConductContentItem item = getItem(position);
        if (item != null) {
            titleView.setText(item.ConductName);
        }
        return convertView;
    }


来自为知笔记(Wiz)