ListView优化adapter getview的两种方式ViewHolder vs HolderView
来源:互联网 发布:windows凭据总丢失 编辑:程序博客网 时间:2024/05/18 01:14
一、ViewHolder方式
如果你还没听说过ViewHolder,那么你该去好好看看官方文档了,而不是埋头写代码。
一个ListView的item布局中需要赋值的子元素太多为了避免重复的调用FindViewById方法,我们一般考虑使用ViewHolder方式来实现BaseAdapter。
如下:
- //在外面先定义,ViewHolder静态类
- static class ViewHolder
- {
- public ImageView img;
- public TextView title;
- public TextView info;
- }
- //然后重写getView
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- if(convertView == null)
- {
- holder = new ViewHolder();
- convertView = mInflater.inflate(R.layout.list_item, null);
- holder.img = (ImageView)item.findViewById(R.id.img)
- holder.title = (TextView)item.findViewById(R.id.title);
- holder.info = (TextView)item.findViewById(R.id.info);
- convertView.setTag(holder);
- }else
- {
- holder = (ViewHolder)convertView.getTag();
- }
- holder.img.setImageResource(R.drawable.ic_launcher);
- holder.title.setText("Hello");
- holder.info.setText("World");
- }
- return convertView;
- }
ViewHolder
在convertView
第一次inflate的时候绑定了相关的子元素,并被convertView
保存下来(setTag方法),当相同的convertView
再次需要显示的时候直接调用convertView
的getTag取出ViewHolder,并对ViewHolder中的元素赋值。使用ViewHolder模式避免了没有必要的调用findViewById():因为太多的findViewById也会影响性能,这点不容易考虑到。
二、HolderView方式
在HolderView方式中,目的同样是为了避免反复的调用findViewById,但是我们将这个findViewByIdde 任务交给了一个HolderView对象
- @Override
- public View getView(int i, View convertView, ViewGroup viewGroup) {
- HolderView holderView;
- // Important to not just null check, but rather to a instanceof
- // since we might get any subclass of view here.
- if (convertView instanceof HolderView) {
- holderView = (HolderView) convertView;
- } else {
- holderView = new HolderView(mContext);
- }
- holderView.bind("标题", R.drawable.ic_launcher, "sajsa");
- return holderView;
- }
- public class HolderView extends GridLayout {
- private ImageView img;
- private TextView title;
- private TextView info;
- public HolderView(Context context, AttributeSet attrs) {
- super(context, attrs);
- View v = LayoutInflater.from(context).inflate(R.layout.list_item, this);
- title = (TextView) v.findViewById(R.id.title);
- img = (ImageView)item.findViewById(R.id.img)
- info = (TextView)item.findViewById(R.id.info);
- }
- public void bind(String stringtitle,int imgrsc, String stringinfo) {
- title.setText(stringtitle);
- img.setImageResource(imgrsc);
- info.setText(stringinfo);
- }
- }
HolderView自己维护一个子元素的集合,同时对外提供绑定数据的公共方法bind。HolderView方式的思想是:对于ListView来讲,每一个Item本身是同一个类只是数据不同。但是需要注意的是使用HolderView方式在Adapter中getView返回的是HolderView对象。
总结:ViewHolder方式使用简单,HolderView方式更符合面向对象规范。
0 0
- ListView优化adapter getview的两种方式ViewHolder vs HolderView
- ListView优化adapter getview的两种方式ViewHolder vs HolderView
- ListView优化adapter getview的两种方式ViewHolder vs HolderView
- 对listview adapter的getview方法的新认识viewholder
- ViewHolder vs HolderView
- ViewHolder VS HolderView ?
- HolderView vs ViewHolder实例
- listview自定义Adapter中重写getview深入了解--convertView ViewHolder
- android listView 重写Adapter方法getView的性能优化问题
- ListView的优化使用-抽取ViewHolder以及adapter类
- BaseAdapter的getView()与ViewHolder的两种写法-更深刻理解ViewHolder
- listview的优化---viewHolder
- ListView的优化--ViewHolder
- ListView的ViewHolder优化
- HolderView 与 ViewHolder 优化App性能
- ListView中adapter加载数据的两种方式
- Android中利用ViewHolder优化自定义Adapter的典型写法(讨论ViewHolder的修饰方式)
- 1.0 listview的adapter中getview的三种写法
- APNS & JPush
- 在自己的web项目中添一个连接池
- Windows下lex 与 yacc的使用
- int转换bigdecimal
- day04_HTML BOM学习总结笔记
- ListView优化adapter getview的两种方式ViewHolder vs HolderView
- 后台多个校验前台ajax接收
- js截取字符串
- Python yield 使用浅析
- 人物肖像油画定制,找人定制一幅人物婚纱肖像油画定制
- 关于Qt4与Qt5不兼容报错
- js设置前台内容字数大小
- JavaScript--事件入门(24)
- 黑马程序员-iOS视频学习之四