ViewHolder模式简洁写法
在安卓中 自定义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;
}
不向前走,不知路远;不努力学习,不明白真理。