转帖!!在此感谢那些让我借我肩膀站的技术前辈们!!
此贴是直接复制eoe中前辈“笨程序员”的帖子。在此谢谢为先,至于转这个帖子的目的就是因为它很实用而且称得上经典,怕错过以后不好找而且让以后遇到此问题的童鞋们更加容易找到此答案,特转此贴!!
再次感谢“笨程序员”前辈。链接:http://www.eoeandroid.com/thread-35403-1-1.html
Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter)
),列表的每一项会显示至页面中。其实,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View,如:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return super.getView(position, convertView, parent);
}
我们看一看下面的这段代码:
public View getView(int position, View convertView, ViewGroup parent) {
View newView = mInflater.inflate(R.layout.list_item, null);
((TextView) newView .findViewById(R.id.text)).setText(DATA[position]);
((ImageView) newView .findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return newView ;
}
上面的代码块中,我通过LayoutInflater.inflate(,)将Layout文件--layout.list_item转换为View.
(注:Layout也是View的子类,但在android中如果想将xml中的Layout转换为View放入.java代码中操作,只能通过Inflater,而不能通过findViewById())
这时,如果我的ITEM项有数以千条这样多或更多呢,再以上面代码块的写法,后果自己想想吧。
于是,改用其它一种写法:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
这时,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。
到这里,问一下,还有没有优化的方法呢,是有的,请看————》》:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
static class ViewHolder {
TextView text;
ImageView icon;
}
这样系统性能会得到更大的提升。
希望可能帮助到大家。这也是平时面试当中面试官经常会问到的"ListView的优化"的问题。
在技术当道的今天,希望所有有志向或者有兴趣在这个行业内发展的同志们,不断地前进,前进!
分享到:
相关推荐
ListView与BaseAdapter的配套使用 理解android 中adapter适配的作用 以及ListView的优化方式
Android ListView性能优化方案示例,绝对有效的帮助解决ListView的性能优化问题,可以放心继承到项目中。
android listview内存优化 10M图片 没有内存溢出和卡顿线程
安卓listview的优化,并且可以分类显示
android_ListView优化Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会...
android listview 优化 实例
Android使用缓存优化ListView
使用BaseAdapter自定义适配器,采用了回收converView和ViewHolder优化代码,并且解决了在ListView中使用Button时,ListView的itemClick不能被触发的问题。
Android ListView多种布局优化demo,使用了两种优化手段,包括convertView,ViewHolder,对应的我的博客地址是: http://blog.csdn.net/u012320459/article/details/47667869
Android ListView异步加载图片,优化滚动效果,不卡顿、流畅显示。主要给新人了解ListView和AsyncTask、Json等使用。
Android MVP+Adapter+ViewHolder抽取-ListView优化方案
Android ListView 优化
listview优化和异步加载全攻略,对android下listview的异步加载和优化,进行了优化,完整而且完美,欢迎下载
android ListView优化
一个android基于ListView实现的滚轮选择器,简简单单一个class就行了,当然效果还有写不足,拿去用的话要根据自己的要求优化下
这个东西做android是必备的,我相信你一定也会,但是我写下来的目的就是记录一下。 这个东西面试也很多会问到的,那么我们怎么回答那? 首先我认为有这么几点: 1、listview在定义的时候宽和高最好固定一下,这样...
1.LruCache :LruCache 通过key--value 键值对的形式存储数据,通过指定一个最大值来限制其内容的数量(LruCache, value>(int maxSize)),每当一个value值被访问时移动到队列的头部,当LruCache...5.listview的优化。
Android系列课程第三季:ListView原理、使用和优化——快速提高 从最重要的UI组件ListView入手,充分了解ListView的原理、使用方法和优化技巧,结合前两讲的内容,快速提高对Android开发技术掌握的能力。
包含内容 横向 listview 微信 listview xlistview 优化
android中listView的优化,同时listView中的列表内容来源于网络,从网络上下载图片图片显示在listViw中,测试用的是1000个item,测试listView的优化!