千家信息网

Android数据适配器ViewHolder怎么用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了Android数据适配器ViewHolder怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android数据适配器ViewHolder怎么用文章都
千家信息网最后更新 2026年11月02日Android数据适配器ViewHolder怎么用

这篇文章主要介绍了Android数据适配器ViewHolder怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android数据适配器ViewHolder怎么用文章都会有所收获,下面我们一起来看看吧。

在使用Listview或GridView的时候,往往需要自定义数据适配器,一般都要覆写getView(),在该方法中有一个convertView参数,该参数就是用来加载数据时的View。

初学者简单但低效的方式

public View getView(int position, View convertView, ViewGroup parent) {     View item= inflater.inflate(R.layout.good_list_item, null, false);           ImageView img = (ImageView) item.findViewById(R.id.img);   TextView price = (TextView) item.findViewById(R.id.price);   img.setImageResource(R.drawable.ic_launcher);   price.setText("$"+list.get(position).price);              return item;  }

每次加载view,都要重新建立很多view对象,如果某条listview中有一万条数据,这种加载方式就歇菜了。

利用convertView

利用Android的Recycler机制,利用convertView来重新回收View,效率有了本质提高。View的每次创建是比较耗时的,因此对于getview方法传入的convertView应充分利用 != null的判断 。

public View getView(int position, View convertView, ViewGroup parent) {        if(convertView==null){           convertView = inflater.inflate(R.layout.good_list_item, null, false);       }       TextView tv_price = (TextView)convertView.findViewById(R.id.price)       ImageView iv = (ImageView)convertView.findViewByID(R.id.img);              return convertView;   }

使用ViewHolder

ViewHolder将需要缓存的view封装好,convertView的setTag才是将这些缓存起来供下次调用。 当你的listview里布局多样化的时候 viewholder的作用体现明显,效率再一次提高。 View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。

class ViewHolder{       ImageView img;       TextView price;  } public View getView(int position, View convertView, ViewGroup parent) {       ViewHolder holder = new ViewHolder();       if(convertView==null){          convertView = inflater.inflate(R.layout.good_list_item, null, false);          holder.img = (ImageView) convertView.findViewById(R.id.img);           holder.price = (TextView) convertView.findViewById(R.id.price);           convertView.setTag(holder);         }else{           holder = (ViewHolder) convertView.getTag();       }       //设置holder       holder.img.setImageResource(R.drawable.ic_launcher);      holder.price.setText("$"+list.get(position).price);                  return convertView;   }

优雅的使用ViewHolder

使用ViewHolder时,每次一遍一遍的findViewById,一遍一遍在ViewHolder里面添加View的定义,view一多,是不是感觉烦爆了,base-adapter-helper这个类库似乎***的解决了这个问题。

其设计思想是使用 SparseArray来存储view的引用,代替了原本的ViewHolder,不用声明一大堆View,简洁明了。

我也自己动手写了一个简单版的ViewHolder。

public class ViewHolder{         private final SparseArray views;      private View convertView;         private ViewHolder(View convertView){          this.views = new SparseArray();          this.convertView = convertView;          convertView.setTag(this);      }        public static ViewHolder get(View convertView){          if (convertView == null) {              return new ViewHolder(convertView);          }          ViewHolder existedHolder = (ViewHolder) convertView.getTag();          return existedHolder;     }        public  T getView(int viewId) {          View view = views.get(viewId);          if (view == null) {              view = convertView.findViewById(viewId);              views.put(viewId, view);          }          return (T) view;      }  }

使用的话就超级简单和简洁了:

public View getView(int position, View convertView, ViewGroup parent) {          if (convertView == null) {              convertView = LayoutInflater.from(context)                      .inflate(R.layout.good_list_item, null, false);          }             ViewHolder mViewHolder = ViewHolder.get(convertView);         TextView price = mViewHolder.getView(R.id.price);         //...其他getView             return convertView;      }

关于"Android数据适配器ViewHolder怎么用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Android数据适配器ViewHolder怎么用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

数据 适配器 适配 方法 知识 简洁 内容 参数 对象 效率 方式 时候 篇文章 缓存 明显 优雅 简洁明了 万条 不用 价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 互联网黑科技 保险科技 互联网保险 上海卓越科技互联网 蓝思科技飞鸽互联网 上海喔噻互联网科技 善班互联网科技有限公司 易通互联网络科技有限公司 互联网科技素材视频竖屏 银川新华互联网科技职业技术培训学校图片 赶超互联网科技 微信多开 互联网科技革命什么开始 杭州壁岐互联网科技有限公司 玉溪互联网科技怎么选 互联网科技如何创业 恒生互联网科技业指数调整周期 互联网与数字科技关系 互联网科技职业技能培训学校 现代互联网科技公司 伍佰万互联网科技是干嘛的 互联网金融公司科技 互联网科技论坛 互联网企业科技类企业如何做账 风投北京互联网科技 扫呗互联网科技有限公司 广西科技产业互联网是什么 唐山双旺合互联网科技产业园 安徽九吞吴互联网科技有限公司 互联网科技创新方面的资料 互联网企业和网络科技有限公司
0