Adapter是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的
getView方法返回一个View。如果列表中有很多的项时会占用极大的系统资源,所以我们需要优化Adapter
1、convertView的使用
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null)
{
//加载ListView item的布局文件
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);
/**
* 利用holder,调用convertView.setTag函数
* 使得convertView创建的内存地址,不为空。
* 然后调用getTag来获得当前位置的tag
* 最后利用holder的各种set操作来替换当前位置的tag。
*/
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 {
private TextView text;
private ImageView icon;
}
上面这种方式对于每个View使用了一个
ViewHolder来控制其内部的子item还使用了
setTag和getTag的方法 将holder绑定到了view上而不是直接的新建View 是对Adapter的优化。
2、测试getView被调用的次数
假设做一个动态刷新的ListView,发现显示的adapter.notifyDataSetChanged()的速度有点慢 那么可以测试下getView调用的次数 是不是太多。调用的次数多的让你觉着莫名其妙 那么说明 肯定是有问题的 一定会影响性能的。
更改方法:
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
将android:layout_height="
wrap_content"修改成:android:layout_height="
fill_parent"就可以了。
如果更改以后没用,ListView周围的控件也是"
wrap_content"那么也需要修改。
3、关于ListView 对于纯色的item背景 其实可以直接设置BackgroundColor 而不要使用图片 这一部分其实可以有不小的提升 同样的 对于任何纯色的背景 应该尽量去设置RGB颜色 而不是全用一张图片做背景。
参考:
http://johncookie.iteye.com/blog/1250049
http://stephen830.iteye.com/blog/1141532
分享到:
相关推荐
然而,在处理大量数据时,这两个控件可能会出现性能问题,导致应用程序响应变慢甚至无响应。本篇将深入探讨如何通过优化策略来改善ListBox和ListView的响应能力,以提升用户体验。 1. **虚拟化技术**: 虚拟化是一...
- `Loader`是更强大的异步数据加载框架,它可以监控数据源的变化并自动刷新UI,适合于ListView等需要实时更新的数据源。 3. **图片库的选择**: - Android社区有许多优秀的图片加载库,如Glide、Picasso、Fresco...
例如,在执行动画或滑动ListView时,由于操作复杂性,容易发生丢帧现象。 - **过度绘制(Overdraw)**:过度绘制是指同一个像素在同帧时间内被绘制多次,造成CPU和GPU资源浪费。它可以由多层次UI结构、不可见UI的绘制...
因此,在设计用户界面时,需要注意以下几点: - **图片资源**:尽量使用较小尺寸的图片,并在不再需要时释放资源。 - **对象引用**:避免长时间持有大对象的引用,及时清理不再使用的对象。 - **缓存策略**:合理...
这样既能减少一次性加载的数据量,又能避免页面加载过慢,提升用户体验。 在ASP.NET中,我们通常使用GridView、ListView或DataList等服务器控件来实现分页。这些控件内置了分页功能,只需设置相应的属性即可启用。...
这种技术常用于社交媒体、新闻网站或者任何需要展示大量列表数据的应用,以优化用户体验,避免一次性加载过多内容导致页面加载速度变慢。 首先,我们来看一下给出的CSS代码。这段CSS定义了列表的基本样式,如表格的...
jQuery Mobile 使用 Ajax 进行页面导航,这使得页面之间可以平滑过渡,而无需完全刷新。然而,这可能会导致历史记录和书签出现问题,因此开发者需要了解如何正确配置 `data-ajax` 属性,以及何时使用 `data-rel=...
应该注意,在 Internet Explorer 所运行的 Visual FoxPro ActiveDoc 只是一个应用程序文件(.app),它也可以在 Visual FoxPro 中直接运行。也正由于这个原因,需要有 Visual FoxPro 的运行时刻版本。Active ...
- **分支管理**:Git分支操作简单快速,SVN分支操作较慢。 #### 54. Socket编程示例 - **TCP客户端**:使用Socket类建立连接。 - **TCP服务器**:使用ServerSocket监听客户端连接。 #### 55. 数据库分页查询 - **...