listview 优化
ListView的优化:
(前两点都是利用ListView的自身优化机制优化【缓存优化】)
1.利用ListView自身的缓存机制,他会缓存条目中的一个条目item,当listview第一屏显示完成之后,就会出现一个缓存条目,其实就是BaseAdapter里面的public View getView(int position, View convertView, ViewGroup parent)。
2.减少findViewById()的次数,findViewById是一个相对比较耗性能的操作,因为这个操作每次都需要到布局中去查找文件。把item里面的控件封装成一个javaBean,当item条目被加载的时候就去找到对应的控件。
3.利用时间去换取时间,比如开机优化,把一些重要的程序先启动了,启动完系统之后再启动其他程序。
4.利用空间去换取时间,把要获取的数据先加载到内存里面,再处理数据的时候,直接从内存中获取。
例如:减少数据库的频繁打开和关闭和减少查询的次数。
Demo:需求: 程序锁,将手机中所有的应用显示出来,是否是带锁的应用用数据库进行存储,通过ListView显示。

3 import java.util.List;
5 import android.app.Activity;
6 import android.os.Bundle;
7 import android.os.Handler;
8 import android.os.Message;
9 import android.util.Log;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.view.animation.TranslateAnimation;
14 import android.widget.AdapterView;
15 import android.widget.AdapterView.OnItemClickListener;
16 import android.widget.BaseAdapter;
17 import android.widget.ImageView;
18 import android.widget.ListView;
19 import android.widget.RelativeLayout;
20 import android.widget.TextView;
21
22 import com.android.hzy.mobilesafe.R;
23 import com.android.hzy.mobilesafe.dao.AppLockDao;
24 import com.android.hzy.mobilesafe.domain.AppInfo;
25 import com.android.hzy.mobilesafe.engine.AppInfoService;
26
27 public class AppLockManagerActivity extends Activity {
28
29 protected static final int SUCCESS_GET_APPLICATION = 0;
30 private ListView lv_applockmanager;
31 private RelativeLayout rl_loading;
32 private AppInfoService appInfoService;
33 private List<AppInfo> appInfos;
34
35 private List<String> appLocks; // 程序锁应用集合
36
37 private AppLockManagerAdapter mAdapter;
38 private AppLockDao appLockDao;
39 private Handler mHandler = new Handler(){
40
41 public void handleMessage(Message msg) {
42 switch (msg.what) {
43 case SUCCESS_GET_APPLICATION:
44 appLocks = appLockDao.findAll();
45 mAdapter = new AppLockManagerAdapter();
46 lv_applockmanager.setAdapter(mAdapter);
47 rl_loading.setVisibility(View.GONE);
48 break;
49
50 default:
51 break;
52 }
53 }
54
55 };
56
57 @Override
58 protected void onCreate(Bundle savedInstanceState) {
59 // TODO Auto-generated method stub
60 super.onCreate(savedInstanceState);
61 setContentView(R.layout.app_lock_manager);
62
63 lv_applockmanager = (ListView) findViewById(R.id.lv_applockmanager);
64 rl_loading = (RelativeLayout) findViewById(R.id.rl_loading);
65 appInfoService = new AppInfoService(this);
66
67 new Thread() {
68 public void run() {
69 appInfos = appInfoService.getAppInfos();
70 Message msg = new Message();
71 msg.what = SUCCESS_GET_APPLICATION;
72 mHandler.sendMessage(msg);
73 };
74 }.start();
75
76 appLockDao = new AppLockDao(this);
77
78 lv_applockmanager.setOnItemClickListener(new MyOnItemClickListener());
79 }
80
81 /**********listview条目点击事件*************************/
82 private final class MyOnItemClickListener implements OnItemClickListener{
83
84 @Override
85 public void onItemClick(AdapterView<?> parent, View view, int position,
86 long id) {
87 // TODO Auto-generated method stub
88 // 通过ViewHolder的iv_lock 减少findViewById
89 ImageView iv_lock = ((ViewHolder)view.getTag()).iv_lock;
90 AppInfo appInfo = (AppInfo) mAdapter.getItem(position);
91 // boolean isLockApp = appLockDao.isLockApp(appInfo.getPackagename()); 减少数据库的查询
92 boolean isLockApp = appLocks.contains(appInfo.getPackagename());
93 if (isLockApp) {
94 // 如果有锁 就解锁
95 appLockDao.delete(appInfo.getPackagename());
96 // 解锁需要将集合中带锁应用的移除
97 appLocks.remove(appInfo.getPackagename());
98 iv_lock.setImageResource(R.drawable.unlock);
99 } else {
100 // 如果没有锁 就加锁
101 appLockDao.add(appInfo.getPackagename());
102 // 加锁需要将有锁的集合中添加该应用
103 appLocks.add(appInfo.getPackagename());
104 iv_lock.setImageResource(R.drawable.lock);
105 }
106
107 // 设置动画
108 TranslateAnimation animation = new TranslateAnimation(0, 80, 0, 0);
109 animation.setDuration(300);
110 view.startAnimation(animation);
111 }
112
113 }
114
115 /**
116 * 适配器
117 */
118 public final class AppLockManagerAdapter extends BaseAdapter{
119
120 private LayoutInflater mInflater;
121
122 public AppLockManagerAdapter() {
123 // TODO Auto-generated constructor stub
124 mInflater = getLayoutInflater();
125 }
126
127 @Override
128 public int getCount() {
129 // TODO Auto-generated method stub
130 return appInfos.size();
131 }
132
133 @Override
134 public Object getItem(int position) {
135 // TODO Auto-generated method stub
136 return appInfos.get(position);
137 }
138
139 @Override
140 public long getItemId(int position) {
141 // TODO Auto-generated method stub
142 return position;
143 }
144
145 @Override
146 public View getView(int position, View convertView, ViewGroup parent) {
147 // TODO Auto-generated method stub
148 View view = null;
149 ViewHolder holder = null;
150 if (convertView != null) {
151 view = convertView;
152 holder = (ViewHolder) view.getTag();
153 Log.i("i", " convertView != null 缓存不等于空 使用缓存");
154
155 } else {
156 Log.i("i", " convertView == null 缓存等于空");
157 view = mInflater.inflate(R.layout.app_lock_manager_item, null);
158 holder = new ViewHolder();
159 holder.iv_appicon = (ImageView) view.findViewById(R.id.iv_appicon);
160 holder.tv_appname = (TextView) view.findViewById(R.id.tv_appname);
161 holder.iv_lock = (ImageView) view.findViewById(R.id.iv_lock);
162 view.setTag(holder);
163 }
164 AppInfo appInfo = appInfos.get(position);
165
166 ImageView iv_appicon = holder.iv_appicon;
167 TextView tv_appname = holder.tv_appname;
168 ImageView iv_lock = holder.iv_lock;
169
170 iv_appicon.setImageDrawable(appInfo.getApp_icon());
171 tv_appname.setText(appInfo.getApp_name());
172
173 // boolean isLockApp = appLockDao.isLockApp(appInfo.getPackagename());
174 boolean isLockApp = appLocks.contains(appInfo.getPackagename()); // 此功能优化后 不用每次查询数据库 直接将所有有锁的程序都放入集合中存储
175 if(isLockApp){
176 iv_lock.setImageResource(R.drawable.lock);
177 }else{
178 iv_lock.setImageResource(R.drawable.unlock);
179 }
180
181 return view;
182 }
183
184 }
185
186 static class ViewHolder{
187 ImageView iv_appicon;
188 TextView tv_appname;
189 ImageView iv_lock;
190 }
191 }

listview 优化的更多相关文章
- listview优化 汇总
1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...
- Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固
1.常驻型广播 常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到. 他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样 ...
- 内存泄露--contentView缓存使用与ListView优化
引起Android内存泄露有很多种原因,下面罗列了一些问题,以后会一一解决 1.构造Adapter时没有使用缓存convertView(衍生出ListView优化问题) 2.查询数据库游标没有关闭 3 ...
- Android——ListView优化
1.ListView基本概念 列表显示需要三个元素: ListView:用来展示列表的View. 适配器:用来把数据映射到ListView上 数据:具体的将被映射的字符串,图片或基本组件 适配器类型分 ...
- Android零基础入门第43节:ListView优化和列表首尾使用
原文:Android零基础入门第43节:ListView优化和列表首尾使用 前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪 ...
- Adaptert Listview 优化
这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多.所以学习了关于listview的优化,并且这也是普遍使 ...
- Android开发之ListView详解 以及简单的listView优化
ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...
- listview优化技术
1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为fal ...
- ListView优化中ViewHolder要不要定义为static静态内部类?
给学生讲课的时候,发现存在这个问题,下来百度了下,发现很纠结,涉及到了内部类对外部类的引用,静态类的生命周期等java知识,现总结如下: static class ViewHolder { //定义l ...
- Android性能优化--Listview优化
ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个it ...
随机推荐
- <路径算法>哈密顿路径变种问题(2016华为软件精英挑战赛初赛)
原创博客,转载请联系博主! 前言:几天前华为的这个软件精英(算法外包)挑战赛初赛刚刚落幕,其实这次是我第二次参加,只不过去年只入围到了64强(32强是复赛线),最后搞到了一个华为的一顶帽子(感谢交大l ...
- eclipse 拨打电话、拨号,发短信
1.拨打电话,拨号 //拨打电话Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(U ...
- 慕课网-安卓工程师初养成-2-12 如何在Java中使用注释
来源:http://www.imooc.com/code/1274 在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 ...
- ORA-12518,TNS:listener could not hand off client connection
前几天在启动应用的时候,在控制台抛出了此异常信息!很明显是数据库方面的问题,不过具体是什么问题哪?百度了一下,网上关于此问题的信息还是有比较多,从异常的提示中我们也能看到是具体是和客户端的连接相关的问 ...
- 重拾qt
最近公司又接了一个煤矿的项目,要写个小程序摘取数据,我是公司唯一c++程序员,本来搞ios搞好好的,现在又得重拾半年没摸得qt了.呵呵...呵呵呵. 这里只记录这次小程序的一些小的总结吧.. 1.中文 ...
- ZoneMinder配置与使用
ZoneMinder是一套基于Linux操作系统的摄像机的视像数据监控的应用软件.应用范围广泛,包括商业或家居防盗等.ZoneMinder支持单一或多台视像镜头应用,包括摄取.分析.记录.和监视来源, ...
- [前端 4] 使用Js实现图片上传预览
导读:今天做图片上传预览,刚开始的做法是,先将图片上传到Nginx,然后重新加载页面才能看到这个图片.在这个过程中,用户一直都看不到自己上传的文件是什么样子.Ps:我发现我真的有强迫症了,都告诉我说不 ...
- 本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
附送PL/SQL Developer11中文版下载地址 1.先到Oracle网站下载Instant Client : http://www.oracle.com/technetwork/databas ...
- SQL server 时间处理自连接
--延时的订单select t1.OrderId order1, t1.VerifyStatusId id1,t1.VerifyDate '时间1', t2.OrderId order2, t2.V ...
- java 个人总结
每周课程总结链接: 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 第十周 java实验报告链接: 实验一 实验二 实验三 实验四 实验五 代码托管链接 课程收获: 学习任何语 ...