Android中GridView和ListView是最重要的两种显示内容的控件,在Android中,受限于手机屏幕的大小,使的不能像电脑一样同时显示多项内容。
这两者都需要一个adapter,可以是自定义适配器,也可以是BaseAdapter,SimpleAdapter,CursorAdapter。自定义适配器中,最为重要的是getView()方法,在该方法中有一个convertView参数,该参数就是用来加载数据时的View。
在ListView中有时我们需要加载大量数据,如果每次都创建一个View,这样会占据大量内存,影响性能。这时就可以考虑用ViewHolder了。
ViewHolder不是Android的开发API,而是一种设计方法,就是设计个静态类,缓存一下,省得Listview更新的时候,还要重新操作。
下面以listView加载方式比较一下viewholder的便利。
viewholder的方式:将convetView的tag设置为ViewHolder,不为空时重新使用即可:
class ViewHolder{
ImageView img;
TextView sitekey;
TextView partname;
TextView price;
TextView value;
TextView quantity_sold;
TextView end_date;
TextView jiantou;
}
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.sitekey = (TextView) convertView.findViewById(R.id.sitekey);
holder.partname = (TextView) convertView.findViewById(R.id.partname);
holder.price = (TextView) convertView.findViewById(R.id.price);
holder.value = (TextView) convertView.findViewById(R.id.value);
holder.quantity_sold = (TextView) convertView.findViewById(R.id.quantity_sold);
holder.end_date = (TextView) convertView.findViewById(R.id.end_date);
holder.jiantou = (TextView) convertView.findViewById(R.id.jiantou);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
//设置holder
holder.img.setImageResource(R.drawable.ic_launcher);
holder.sitekey.setText(list.get(position).sitekey);
holder.partname.setText(list.get(position).partname);
holder.price.setText("$"+list.get(position).price);
holder.value.setText("$"+list.get(position).value);
holder.quantity_sold.setText("已售出:"+list.get(position).quantity_sold);
holder.end_date.setText("截止日期:"+list.get(position).end_date);
return convertView;
}
错误的加载方式:每一次都重新定义一个View载入布局,再加载数据:
public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return item;
}
正确的加载:当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据。
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, parent, false);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
convertView 在API中的解释是The old view to reuse, if possible, 第一次getView时还没有convertView,这时你便创建了一个新的view,下次getView时就有这个“旧的”convertView了 setTag的作用才是把查找的view通过ViewHolder封装好缓存起来方便多次重用,当需要时可以getTag拿出来
当你的listview里布局多样化的时候 viewholder的作用就有比较明显的体现了。 当然了,单一模式的布局一样有性能优化的作用 只是不直观。 假如你2种模式的布局 当发生回收的时候 你会用setTag分别记录是哪两种 这两种模式会被封装到viewholder中进行保存方便你下次使用。 所以当加载大量数据时,最好使用ViewHolder。
分享到:
相关推荐
// 初始化ViewHolder中的视图 textView = itemView.findViewById(R.id.text_view); } } } ``` 在上述代码中,我们使用SparseArray来存储ViewHolder对象,当需要创建新的ViewHolder时,我们先检查SparseArray中...
我们在使用ListView的时候,经常会使用的ViewHolder方式作为缓存,每次都需要手动的通过viewholder.icon = convertview.findVIewByid(id);一般的app都会有好几个页面会用到ListView,这样的话我们的代码量就会很大,...
如果不为空,直接从ViewHolder中获取视图,避免了多次findViewById操作。 ```java @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView ...
`ViewHolder`是Android开发中的一个设计模式,主要用于减少在`ListView`适配器`getView()`方法中的视图查找时间。在没有使用`ViewHolder`的情况下,每次`getView()`被调用时,都需要通过`findViewById()`方法找到...
在Android开发中,ListView是一个非常重要的组件,它用于...在实际开发中,掌握ListView的使用和ViewHolder优化对于提升应用性能至关重要。通过不断实践和优化,开发者可以创建出高效、用户体验良好的数据展示界面。
// 在Adapter中使用 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return ViewHolderUtils.create(parent, R.layout.item_layout); } @Override public void ...
Android ViewHolder示例 该项目的例子 将ViewHolder模式用于ListView 。 参见 对GridView使用ViewHolder模式。 请参阅 实施RecyclerView.ViewHolder为RecyclerView 。 请参阅 参考-> ...>将
当`convertView`非空时,我们从convertView的Tag中获取已存在的ViewHolder,直接使用它来填充数据,避免了重复查找UI元素。 总之,通过使用ViewHolder模式,我们可以有效地减少`findViewById()`的调用次数,提高...
例如,我们可以创建一个BaseAdapter的子类,然后使用泛型来定义数据类型,这样就可以在ListView和GridView中使用同一个Adapter实例。 接着,我们谈谈ViewHolder设计模式。在ListView或GridView滚动时,如果每次都去...
ViewHolder模式是Android开发中为了提升ListView性能而设计的一种优化策略。它通过减少findViewById的调用来改善视图的绘制速度。在没有使用ViewHolder的情况下,每当ListView需要显示一个新项时,系统会重新查找并...
在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据列表,具有高效的数据复用机制。然而,由于ViewHolder的复用性,有时会导致显示错乱的问题。本篇文章将深入探讨这个问题,并提供相应的...
官方版本,亲测可用
官方版本,亲测可用
官方版本,亲测可用
官方版本,亲测可用
在Android开发中,ListView是常用的数据展示控件,但随着数据量增大,滑动时可能出现卡顿现象。为了解决这个问题,开发者们引入了ViewHolder设计模式。本篇将详细讲解ViewHolder的超级简洁写法,以及如何通过这个...
官方版本,亲测可用
官方版本,亲测可用
官方版本,亲测可用
官方版本,亲测可用