android自定义Adapter中getView()三种写法及其效率问题。
2013-12-11 15:04
399 查看
android中常常需要我们自定义Adapter,甚至经常建一个包专门放各种自定义adapter类。常见的有ListView继承自BaseAdapter的adapter、ExpandableListView继承自BaseExpandableListAdapter的adapter等。
-->第一种方式:
每一次都重新定义一个View载入布局,再加载数据
-->第二种方式:
当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据
-->第三种方式:
定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
显然这三种方式的效率是一次递增的。
第一种与第二种比较,效率提高是因为:判断convertview不为空时,才创建View,避免了不必要的View创建。
第二种与第三种比较,效率提高是因为:判断convertView不为空时,顺便加载了(findviewbyid)View中的子控件,避免了convertview不为空时依然要查找(findviewbyid)View中子控件。
以上是理论上的推测,下面贴出实际效率对比图:
第一种方式 第二种方式 第三种方式
这张图据说是从“google 2010 I/O大会”上截取的。反正我信了。。。
另外,还有一点小经验的问题:
当处理一些耗时的资源加载的时候需要做到以下几点,以使你的加载更快更平滑:
1. 适配器在界面主线程中进行修改
2. 可以在任何地方获取数据但应该在另外一个地方请求数据
3. 在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法
-->第一种方式:
每一次都重新定义一个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; }
-->第三种方式:
定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
static class ViewHolder { TextView text; ImageView icon; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_icon_text, parent, false); 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; }
显然这三种方式的效率是一次递增的。
第一种与第二种比较,效率提高是因为:判断convertview不为空时,才创建View,避免了不必要的View创建。
第二种与第三种比较,效率提高是因为:判断convertView不为空时,顺便加载了(findviewbyid)View中的子控件,避免了convertview不为空时依然要查找(findviewbyid)View中子控件。
以上是理论上的推测,下面贴出实际效率对比图:
第一种方式 第二种方式 第三种方式
这张图据说是从“google 2010 I/O大会”上截取的。反正我信了。。。
另外,还有一点小经验的问题:
当处理一些耗时的资源加载的时候需要做到以下几点,以使你的加载更快更平滑:
1. 适配器在界面主线程中进行修改
2. 可以在任何地方获取数据但应该在另外一个地方请求数据
3. 在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法
相关文章推荐
- Android自定义ListView或GridView适配器Adapter的getView方法不执行的问题
- 1.0 listview的adapter中getview的三种写法
- Android-关于一个界面同级中需要两个listView时,一个ListView被嵌套在ScrollView中,ListView的适配器adapter中的getView执行次数重复问题
- 【Android日记】自定义View及其布局问题
- Android 解决ListView、GridView在首次显示时adapter可能多次调用getView的问题
- Android中利用ViewHolder优化自定义Adapter的典型写法
- Android中利用ViewHolder优化自定义Adapter的典型写法
- 【android学习笔记】自定义Adapter继承BaseAdapter获取不到getview或者getview不执行的问题
- 【转】 android-继承BaseAdapter--自定义适配器,getView执行多次的解决方法
- ListView和GridView 自定义Adapter的getView()方法调用问题
- Android自定义View之三种流行进度条的写法
- android自定义adapter之简单写法
- Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的调用方法一致——含ViewHolder显示效率的优化
- Android中Spinner下拉列表(简单layout.xml,ArrayAdapter和自定义Adapter实现)及下拉框提示prompt问题
- 【android学习笔记】自定义Adapter继承BaseAdapter获取不到getview或者getview不执行的问题
- android listView 重写Adapter方法getView的性能优化问题
- android自定义接口,然后在activity中实现点击监听,调用getView解决滑动错位的问题
- Android中利用ViewHolder优化自定义Adapter的典型写法(讨论ViewHolder的修饰方式)
- 自定义Adapter开发中没有回调getView()的问题
- listview的adapter中getview的三种写法