In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-04-14 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >
Share
Shulou(Shulou.com)06/01 Report--
本篇内容介绍了"android UI更新的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
之前有段时间写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个状态,你按状态分类写,还是按View分类写。这个意思就是:按正常人思维吧,比如你的页面有两种模式,一般人就会写
if (mode == A) { viewA.xxxxxx viewB.xxxxxx ... } else if (mode == B) { viewA.xxxxxx viewB.xxxxxx ... }"android UI更新的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 211
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.