付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】androidUI更新的方法
本篇内容介绍了“androidUI更新的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让在下带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!之前有段时间写Windows桌面程序悟出的道理。是这样的,有时候,我们需要创建一个符合业务的View,或者称为UI对象,比如,即时通讯软件的好友列表里面的每个item,那么这个item要有头像,名字,简短描述三个数据项。那么,我们这个View对象,就得有三个对应的方法来设置这三个属性,然后View显示的时候,就显示出我们***的数据就好了。最最最开始的时候,我都是耿直的写成这样。//
以下是伪代码的形式,并不严谨
class
UserItemView
extends
View
{
ImageView
mAvatar;
TextView
mName;
TextView
mDesc;
public
void
setAvatar(Bitmap
avatarImage)
{
mAvatar.setImage(avatarImage);
}
public
void
setName(String
name)
{
mName.setText(name);
}
public
void
setDesc(String
desc)
{
mDesc.setText(desc);
}
}在最开始的时候,这样是OK的,看起来非常***,没有任何问题。如果某个用户的数据变了,就更新某个数据就好了。好,现在问题了,这样写的问题在于,当状态/数据之间相互依赖对UI的显示产生影响时,那么就会出问题,代码会混乱。我们现在提个这样的需求,如果描述(desc)是空的,就显示出头像,如果不是空的,就不显示头像。需求确实很奇怪,但是实际的工作中一定会遇到类似的情况。那么,首先我们想当然的改动一下代码吧。class
UserItemView
extends
View
{
ImageView
mAvatar;
TextView
mName;
TextView
mDesc;
String
mDescData;
public
void
setAvatar(Bitmap
avatarImage)
{
mAvatar.setImage(avatarImage);
}
public
void
setName(String
name)
{
mName.setText(name);
}
public
void
setDesc(String
desc)
{
mDescData
=
desc;
if
(mDescData
==
null
||
mDescData
.equals(""))
{
mAvatar.setVisible(true);
}
else
{
mAvatar.setVisible(false);
}
mDesc.setText(mDescData
);
}
}你看,现在设置描述的方法里要去管头像的显示情况,这就很恶心了。如果有更多的数据项和状态,更多的UI控件,他们之间有非常多的依赖关系,如果按这样的写法,你的每个方法里面的逻辑都会变得非常恶心,复杂。甚至,设置某个UI的状态还需要依赖其他的数据项,你没办法,只能把无关的数据当参数传入,就会变成这样。//
!!!爆炸!!!为什么头像要关注其他的数据!!!
public
void
setAvatar(Bitmap
avatarImage,
String
desc)
{
mAvatar.setImage(avatarImage);
if
(desc==
null
||
desc.equals(""))
{
mAvatar.setVisible(true);
}
else
{
mAvatar.setVisible(false);
}
}当时,我那个UI已经变得非常恶心了,在这样的情况下,我终于意识到,对UI对象的更新,不能就地去做,UI对象的更新,应该用一个统一的方法来做,而会改变UI显示情况的那些setXXXX方法,只做两件事,一是把数据设到这个对象的成员属性上,另一件事就是调用统一的方法来更新UI。其实一个标准的设计一直在眼前,直到那一刻,我才意识到和真正的理解。那就是Android中的View。Android中的每个View的子类,都有超级多的set方法,比如TextView,就有setText,setTextColor等等。它就是每个set方法,实际上是给这个对象做一个数据上的变化,然后就不管了。等到系统来调用OnDraw方法的时候,在OnDraw方法中统一的来更新UI。接下来就简单了。我们的代码改成这样:class
UserItemView
extends
View
{
ImageView
mAvatar;
TextView
mName;
TextView
mDesc;
String
mNameData;
String
mDescData;
Bitmap
mAvatarData;
public
void
updateView()
{
mAvatar.setImage(mAvatarData);
if
(mDescData==
null
||
mDescData.equals(""))
{
mAvatar.setVisible(true);
}
else
{
mAvatar.setVisible(false);
}
mDesc.setText(mDescData);
mName.setText(mNameData);
}
public
void
setAvatar(Bitmap
avatarImage)
{
mAvatarData
=
avatarImage;
updateView();
}
public
void
setName(String
name)
{
mNameData
=
name;
updateView();
}
public
void
setDesc(String
desc)
{
mDescData
=
desc;
updateView();
}
}注意到,添加了一个updateView方法,这个方法专门用来将数据更新到UI上,这样写,其他set方法一律只做把数据存进来的事情,updateView方法专门根据当前的数据状态更新UI,这样set方法就干净整洁。而逻辑再复杂的显示逻辑,都不用怕,在updateView里面搞就行了。我曾经并且一直在维护的一个Activity,它大概有15+个View,20-30个数据和状态,这些数据和状态会谜一般的印象着这些view的显示。当时年轻不懂事,就耿直的在数据变化的后面(下一行),立马就更新UI的状态。有如下这些位置吧:点击事件系统回调网络请求回调定时器,handler这么多地方都在更新数据,并且改变UI,维护起来简直要屎。后来,在我领悟到上面这个技巧后,我重构了一波,里面有个超级大的updateView方法,然后对每个View进行更新。这里有另一个小技巧,就是你有1w个View,和1w个状态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宿州航空职业学院《病理学》2025-2026学年期末试卷
- 阜阳科技职业学院《房屋建筑与装饰工程估价》2025-2026学年期末试卷
- 阳光学院《临床输血学检验技术》2025-2026学年期末试卷
- 公考铁路常识试题及答案
- 福建农林大学《笔译》2025-2026学年期末试卷
- 有色金属加工质检员安全文化测试考核试卷含答案
- 火柴制造工安全实操评优考核试卷含答案
- 船体火工岗前岗中技能考核试卷含答案
- 心脏骤停后综合治疗指南对比2026
- 咨询行业精英之路-打造专业咨询师的全方位素质
- BCG -2026效率之后中国医药创新的价值攀登研究报告
- 2026届贵州贵阳高三适应性考试语文试卷+答案
- 元代美术题库及答案大全
- DB32∕T 5279-2025 档案智能开放审核工作规范
- 山东省济南市2026年中考语文模拟试卷四套附答案
- 2026国家核应急响应技术支持中心招聘3人笔试参考题库及答案解析
- 2026年春江酒城嘉苑“楼上养老 楼下医疗”CCRC社区运营模式解析
- GB/T 13967-2026全宗管理规则
- 雇佣关系培训
- 2025年工程类事业编考试题目及答案
- 2025年水利工程质量检测与管理规范
评论
0/150
提交评论