listview自定义Adapter中重写getview深入了解--convertView ViewHolder
2015-06-22 22:32
393 查看
1.方法 public View getView(int position, View convertView, final ViewGroup parent) 有三个参数
第一个参数position---该视图在适配器数据中的位置
第二个参数convertView---旧视图 :
第三个参数parent: 此视图最终会被附加到的父级视图
比如:
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;
}
4.
第一个参数position---该视图在适配器数据中的位置
第二个参数convertView---旧视图 :
展示在界面上的一个item。因为手机屏幕就那么大,所以一次展示给用户看见的内容是固定的,如果你List中有1000条数据,不应该new1000个
converView,那样内存肯定不足,应该学会控件重用,滑出屏幕的converView就在下面新进来的item中重新使用,只是修改下他展示的值
第三个参数parent: 此视图最终会被附加到的父级视图
这个属性是加载xml视图时使用,确定他的父控件
比如:
View v = null; if (convertView == null) { v = LayoutInflater.from(context).inflate( R.layout.adapter__item, parent, false); Holder vh = new Holder(); vh.text = (TextView) v.findViewById(R.id.text1); v.setTag(vh); } else { v = convertView; } Holder vh = (Holder) v.getTag(); vh.text.setText(data[position]); return v;
2.如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理: a.如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。 b.ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。 c. 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。3.初学者简单但低效的方式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减少重复findViewByID带来的消耗,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;
}
4.
相关文章推荐
- Gson数据解析
- 死锁问题
- jquery源码之属性判断-$.type类型
- java设计模式之——代理模式
- python日志输出—logging直接代码配置
- Android自定义控件View的探讨
- Hadoop 学习
- 《大道至简》-阅读笔记3
- ECMASCRIPT5 DOM Document类型详解
- hive php连接查询
- 注册用户名字符长度判断细节
- Android ContentProvider总结
- Cinder meeting 2015-06-17
- jqGrid 各种参数 详解
- 2015062207 - 小诗一首(勉励自己)
- [LeetCode][SQL]Department Highest Salary
- Android MMS数据库
- 首部讲Python爬虫电子书 Web Scraping with Python
- RPM管理
- Length of Last Word