Android之——ListView优化

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47209253

作为客户端,其最主要的任务就是最直观的和用户交互。从服务器拿数据,解析过后显示数据,根据用户操作按照一定的协议传回数据,达到用户想要的结果。这是我自己的理解,所以我们的程序,必须给用户一个良好的体验。

listView可以说是安卓开发中很重要的一个控件。我所做的项目中,几乎每个页面都会有listView。Adapter是listView和数据源间的中间人。当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图。触摸滚动时,频繁调用。支持成百上千条数据。然而listView同时也很复杂,想要做好优化也不容易,下面是我自己整理的listView的优化方式

1、最简单的方法,最慢且最不实用

public View getView(int pos, View convertView, ViewGroup parent){
	 View item = mInflater.inflate(R.layout.list_item, null);
	 ((TextView) item.findViewById(R.id.text)). setText(DATA[pos]);
	 ((ImageView) item.findViewButId(R.id.icon)).
	 setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
	 return item;
}

每条数据我们都会去解析布局。相当于每次都去new一个对象,写第一个listView的时候我也是这样写的,功能自然能实现,但是实际上效率很低我们

2、可以利用convertView回收视图,效率能提高200%

 public View getView(int pos, View convertView, ViewGroup parent){
	if (convertView == null) {
		convertView = mInflater.inflate( R.layout.list_item, null);
	}
	//这个地方相当于做了一个缓存机制。只有convertVIew为空的时候我们才去解析布局,因为解析布局实际上是很麻烦,很耗时的。我们只解析一次布局,其他的我们用同一个缓存的布局
	((TextView) convertView.findViewById(R.id.text)).
	setText(DATA[pos]);
	((ImageView) convertView.findViewButId(R.id.icon)).
	setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
	return convertView;
}

3、利用viewholder模式,效率在提高50%

static class ViewHolder {
	TextView text;
	ImageView icon;
}
public View getView(int pos, View convertView, ViewGroup parent){
	ViewHolder holder;
	if (convertView == null) {
		convertView = mInflater.inflate(R.layout.list_item, null);
		holder = new ViewHolder();
		holder.text = (TextView) convertView.findViewById(R.id.text));
		holder.icon = (ImageView) convertView.findViewButId(R.id.icon));
		convertView.setTag(holder);
	}else{
		holder = (ViewHolder) convertView.getTag();
	}
	holder.text.setText(DATA[pos]);
	holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
	return convertView;
}

以上3点是listView中常用的,当然也是最基本的优化方式。如果没有什么特殊要求,对于android来说这3种优化是必须存在的。还有其他的一些优化方法:

4、背景和图像

视图背景图像总会填充整个视图区域

1)图像尺寸不合适会导致自动缩放

2)避免实时缩放

3)最好预先缩放到视图大小

 originalImage = Bitmap.createScaledBitmap(
	originalImage,    // 缩放图像
	view.getWidth(),  // 视图宽度
	view.getHeight(), // 视图高度
	true); // 线性过滤器

默认情况下, 窗口有一个不透明的背景

有时可以不需要

最高层的视图是不透明的      layout_width  = fill_parent

最高层的视图覆盖整个窗口    layout_height = fill_parent

更新看不见的背景是浪费时间

5、删除窗口背景:

1)修改编码

 public void onCreate(Bundle icicle){
	super.onCreate(icicle);
	setContentView(R.layout.mainview);
	// 删除窗口背景
	getWindow().setBackgroundDrawable(null);
	...
}

6、修改xml

首先确定你的res/values/styles.xml有

parent="android:Theme">

然后编辑androidmainfest.xml

 android:theme="@style/NoBackgroundTheme">
   ...

7、更新请求

当屏幕需要更新时,调用invalidate()方法,简单方便,但是更新了整个视图,代价太高。

最好先找到无效区域,然后调用

invalidate(Rect dirty);
invalidate(int left, int top, int right, int bottom);

8、视图和布局

如果一个窗口包含很多视图,启动太慢,绘制时间长,用户界面反应速度很慢

解决方法:

1)使用textview的复合drawable减少层次

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"
android:drawableLeft="@drawable/icon"/>

2)使用viewstuf延迟展开视图

在xml文件中定义viewstuf

android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"/>

在需要展开视图时

findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// 或者
View importPanel = ((ViewStub)
findViewById(R.id.stub_import)).inflate();

9、使用合并中间视图

默认情况下,布局文件的根作为一个节点,加入到父视图中,如果使用merge可以避免根节点

"http://schemas.android.com/apk/res/android">

10、减少android的容器布局嵌套

android的布局嵌套其实在解析的时候也是很花时间的,所以,我们在能实现功能的基础上尽量避免很多层的嵌套。写布局的时候养成习惯就跟我们写java代码一样看到重复代码就尽量想办法去优化一样。

11、使用自定义视图

 class CustomView extends View {

	@Override
	protected void onDraw(Canvas canvas) {
	// 加入你的绘图编码
	}

	@Override
	protected void onMeasure(int widthMeasureSpec,
	int heightMeasureSpec) {
	// 计算视图的尺寸
	setMeasuredDimension(widthSpecSize, heightSpecSize);

	}

}

12、内存分配:尽量避免在性能敏感的代码当中创建java对象

测量 onmeasure()
布局onlayout()
绘图 ondraw() dispatchdraw()
事件处理 ontouchevent() dispatchtouchevent()
adapter: getview() bindview()

13、管理好对象:

1)适用软引用:内存缓存的最佳选择

2)适用弱引用:避免内存泄露

14、内存缓存:

private final HashMap> mCache;
public void put(String key, T value) {
	mCache.put(key, new SoftReference(value));
}
public T get(String key, ValueBuilder builder) {
	T value = null;
	SoftReferece reference = mCache.get(key);
	if (reference != null) {
		value = reference.get();
	}
    return value;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 02:18:40

Android之——ListView优化的相关文章

Android之ListView优化

1 import java.util.List; 2 3 import com.example.contentprovider.R; 4 import com.example.entity.ImagePath; 5 import com.example.util.Util; 6 7 import android.content.Context; 8 import android.view.LayoutInflater; 9 import android.view.View; 10 import

Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到. 他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样的方式是静态注冊 以下是配置样例 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" andro

Android中用ListView创建应用商店时的几个优化

package com.example.ex01_1; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Arra

Android MaoZhuaWeiBo Adapter ListView优化及发送微博 - 4

这一篇主要给大家说说Adapter ListView优化及发送微博,我们都知道Android在一些比较耗内存的类里,为了尽量避免浪费内 存,我们需要对我们的组件之类的进行优化,使其节约不必要的资源浪费 自定义适配器: package com.neweriweibo.adapter; /** * 适配器 * @author Engineer-Jsp * @date 2014.10.28 * */ import java.util.ArrayList; import com.neweriweibo.

Android之ListView异步加载网络图片(优化缓存机制)【转】

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决.下面提出一些优化: 1.采用线程池 2.内存缓存+文件缓存 3.内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4.对下载的图片进行按比例缩放,以减少内存的消耗 具体的代码里面说明.先放上内存缓存类的代码MemoryCache.java: public class MemoryCache { private static final String TAG = "MemoryCa

Android中ListView的几种常见的优化方法

Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapter类,我们这里都继承自BaseAdapter,这里我们使用一个包含100个字符串的List集合来作为ListView的项目所要显示的内容,每一个条目都是一个自定义的组件,这个组件中只包含一个textview: Activity: package com.alexchen.listviewoptimi

Android ListView优化篇

在我的上一篇博客<Android ListView基础篇>中陈列了ListView和adapter的多种结合方式的基本使用,在本篇文章中将具体讲述如何通过多种方式处理好ListView的优化问题. 在上篇文章的例子中,我们使用了一张图片和一个文本作为每一行的数据,发现效果已经完全达到了,而且没出现什么问题.但如果我们将Item的数量调大,比如调到1000.10000.100000条数据,这个时候当你打开ListView的时候,肯定会不禁感慨"什么鬼,卡机了?!"等了好几秒钟

ym——Android之ListView性能优化

Android之ListView性能优化 如果有看过我写过的15k面试题的朋友们一定知道,ListView的优化方式有以下几种: 重用了convertView ViewHolder static class ViewHolder 在列表里面有图片的情况下,监听滑动不加载图片 以上是大致的说了以下,应付面试已经足够了,如果要使用到项目中,可能有些初学者就迷茫了.接下来我详细的说一下,这个是如何优化的. 重用了convertView getView这个方法会调用的次数是你们的数据条目数*2,重用了c

Android 常驻与非常驻型广播的区别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManifast.xml进行注册.通常说这种方式是静态注册 下面是配置例子 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" android