listview加载性能优化之view的复用

简介: listview加载性能优化之view的复用

在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。


一般我们都会给listview set一个adapter ,然后adapter里面初始化的方法就是 getview(),这个方法 简单说是这个意思,就是 你的listview有多少行,或者说count值是多少,他就会走多少次getview().所以 优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。


getview的加载方法一般有以下三种种方式:


最慢的加载方式是每一次都重新定义一个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,不为空时重新使用即可


public class ViewHolder {
TextView txt;
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.txt= (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;
}


相关文章
|
2月前
|
存储 Android开发 开发者
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
32 0
|
Android开发
Android | Fragment.setUserVisibleHint()懒加载过时问题优化
Fragment.setUserVisibleHint()懒加载过时问题优化
531 0
|
XML 缓存 Android开发
LayoutInflater 布局渲染工具原理分析
LayoutInflater 布局渲染工具原理分析
110 0
LayoutInflater 布局渲染工具原理分析
|
XML 前端开发 数据可视化
Android View使用、自定义和性能优化
View的继承关系 创建View对象 使用XML布局定义View,再用代码控制View 举例 1.创建activity_view.xml文件 2.加载布局文件、关联控件 3.在获得XML布局文件中的视图对象时需要注意下面几点: 4.用代码控制视图 使用代码的方式来创建View对象 实例 1.获得当前的容器视图对象 2.获得或创建待添加的视图对象 3.将相应的视图对象添加到容器视图中 总结 自定义View 为什么要自定义View 自定义View的基本方法 需要用到的两个对象 自绘控件View实例 1、直接继承View类 2、在布局 XML 文件中使用自定义View 性能优化
304 0
Android View使用、自定义和性能优化
|
Android开发 开发者 异构计算
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(二)
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(二)
257 0
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(二)
|
Android开发 开发者 异构计算
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(一)
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(一)
416 0
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(一)
|
前端开发 容器
Flutter中ListView加载图片数据的优化
在使用ListView懒加载模式时,当ListView的Item中有图片信息时,在快速滚动过程中会大量的浪费流量与内存,甚至会造成在滚动过程中页面的卡顿效果。 在这里提出优化方案,当开始滚动时不加载图片,滚动结束后再加载图片,这个优化方案实现的效果如下图所示,在快速滑动列表数据时,图片未加载,运行内存无明显波动。
Flutter中ListView加载图片数据的优化
|
缓存
ViewPager懒加载极致优化
目录介绍 01.ViewPager简单介绍 02.ViewPager弊端分析 03.ViewPager预加载 04.ViewPager部分源码 05.懒加载出现问题 06.如何实现预加载机制 07.
3402 0