1. 如何使用 Adapter
Adapter 是 ListView 和数据源之间的中间人
Adapter 当每条数据进入可见区时 ,Adapter 的 getView() 会被调用
,返回代表具体数据的视图 ,触摸滚动时, 频繁调用 ,支持成百上千条数据
有效方式使用 ViewHolder 模式, 效率会提高很多,另外每一个Item的视图文件布局 越简单越好!
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder viewHolder=null;
if (arg1==null) {
viewHolder=new ViewHolder();
arg1=mInflater.inflate(R.layout.noticelistview_item_laout, null);
/*两个布局*/
viewHolder.tv_title=(TextView)arg1.findViewById(R.id.tv_title);
viewHolder.tv_time=(TextView)arg1.findViewById(R.id.tv_time);
arg1.setTag(viewHolder);
}else {
viewHolder=(ViewHolder)arg1.getTag();
} viewHolder.tv_title.setText(arrayList.get(arg0).getRES_TITLE());
viewHolder.tv_time.setText(arrayList.get(arg0).getRES_ADDTIME());
return arg1;
}
private class ViewHolder
{
TextView tv_title;
TextView tv_time;
}
2. 背景和图像
选择恰当的图像尺寸
视图背景图像总会填充整个视图区域
图像尺寸不合适会导致自动缩放
避免实时缩放
最好预先缩放到视图大小
originalImage = Bitmap.createScaledBitmap(
originalImage, // 被缩放图像
view.getWidth(), // 视图宽度
view.getHeight(), // 视图高度
true); // 双线性过滤器
窗口背景
默认情况下, 窗口有一个不透明的背景
有时可以不需要
最高层的视图是不透明的
最高层的视图覆盖整个窗口
layout_width = fill_parent
layout_height = fill_parent
更新看不见的背景是浪费时间
所以需要删除窗口背景
如下:
@Override
public void onCreate(Bundle icicle){
super.onCreate(icicle);
setContentView(R.layout.mainview);
// 删除窗口背景
getWindow().setBackgroundDrawable(null);
...
}
或者 在style样式中指定
方法二:修改 XML 声明
首先确定你的 res/values/styles.xml
<resources>
<style name="NoBackgroundTheme" parent="android:Theme">
<item name="android:windowBackground">@null</item>
</style>
</resources>
然后编辑 AndroidManifest.xml
3. 更新请求
当屏幕需要更新时, 调用 invalidate()
简单方便
但会更新整个视图, 太贵了
最好先找到无效区域, 然后调用
invalidate(Rect dirty);
invalidate(int left, int top, int right, int
bottom);
这样执行效率会大大提高!
4. 视图和布局
1、如果一个窗口包含很多视图
启动时间长
测量时间长
布局时间长
绘制时间长
2、如果视图树深度太深 ,造成如下情况出现:
StackOverflowException
用户界面反应速度很慢
3、解决方法
使用 TextView 的复合 drawables 减少层次
使用 ViewStub 延迟展开视图
使用 合并中间视图
使用 RelativeLayout 减少层次
使用自定义视图
使用自定义布局
- 内存分配
1、在性能敏感的代码里, 尽量避免创建 Java 对象
测量: onMeasure()
布局: onLayout()
绘图: dispatchDraw(), onDraw()
事件处理: dispatchTouchEvent(), onTouchEvent()
Adapter: getView(), bindView()
2、GC, 垃圾回收
整个程序会暂停
慢 (大约几百个毫秒)
3、管理好对象
使用软引用
内存缓存的最佳选择使用弱引用
避免内存泄露