千家信息网

android UI更新的方法

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,本篇内容介绍了"android UI更新的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!之前有段
千家信息网最后更新 2024年11月23日android UI更新的方法

本篇内容介绍了"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更新的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0