在Android中,經常會遇到一些在UI上顯示的值與實際業務需要的值不一致的場景,這時就是列舉發揮用武之地的時候了
看下圖所示的這個場景:
這個場景是一個類似於web中<select>
的場景(圖中這個下拉元件是我自己寫的一個自定義View,用於替換SDK內建的Spinner),從這個場景中不難看出,我們在UI中需要顯示的值和業務邏輯中需要的值是不一樣的(後端給的介面定義了一組數字來作為引數),我們不能直接把UI中的“正面”這兩個字作為引數傳給業務邏輯的方法,而應傳遞一個對應於“正面”的值,該如何實現這個場景呢,這時候列舉就該登場了
Talk is cheap. Show me the code.
//程式碼片段1
public enum Relativity {
//直接使用中文來給列舉命名,從而利用繼承自父類的 .toString() 來返回UI需要的值
全部 {
@Override
public String value() {
return "";
}
}, 正面 {
@Override
public String value() {
return "1";
}
}, 中性 {
@Override
public String value() {
return "0";
}
}, 負面 {
@Override
public String value() {
return "-1";
}
};
public abstract String value(); //定義一個抽象方法讓子類來實現,這個方法的返回值是業務邏輯中需要用到的值
}複製程式碼
//程式碼片段2 (這個 bindData 是我自定義View裡的繫結資料的方法,實際上裡面是呼叫了ArrayAdapter的addAll(T... items))
spinnerRelativity.bindData(Relativity.values()); //直接使用列舉的 .values() 返回所有此類列舉所組成的陣列作為引數傳給UI複製程式碼
//程式碼片段3
spinnerRelativity.setOnValueChangeListener(new OnValueChangeListener() {
@Override
public void onValueChange(View view, CharSequence originalValue, CharSequence newValue) {
relativity = Relativity.valueOf((String) newValue) //onValueChange 是我自定義View裡的一個回撥方法,如圖所示,當使用者選中“全部”時方法的第二個CharSequence引數“newValue”的值就是一個字串 "全部", 這時,利用列舉的 valueOf(String s) 方法就可以從這個字串得到對應的列舉物件
.value(); //得到列舉物件後再呼叫列舉中自定義的 .value() 獲得業務邏輯所需要的值
//此處是你的業務邏輯
}
});複製程式碼