Android 用户界面编程技巧

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、管理好对象

  • 使用软引用
    内存缓存的最佳选择

  • 使用弱引用
    避免内存泄露

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值