亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android UI更新的方法

發布時間:2022-03-30 10:13:58 來源:億速云 閱讀:151 作者:iii 欄目:移動開發

本篇內容介紹了“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更新的方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣化县| 沛县| 新巴尔虎右旗| 阿拉善右旗| 溧水县| 五河县| 行唐县| 临洮县| 醴陵市| 抚顺市| 昭觉县| 昆山市| 大丰市| 宜章县| 甘德县| 阿城市| 江都市| 平潭县| 神农架林区| 福海县| 闵行区| 大城县| 汾阳市| 保亭| 富平县| 临夏县| 呈贡县| 淳化县| 麻城市| 平湖市| 长阳| 奉新县| 隆林| 乐陵市| 昌黎县| 南召县| 肃北| 吉安市| 大竹县| 景谷| 龙胜|