巧用列舉來處理UI中顯示值與業務值不同的場景

since1986發表於2019-01-16

在Android中,經常會遇到一些在UI上顯示的值與實際業務需要的值不一致的場景,這時就是列舉發揮用武之地的時候了

看下圖所示的這個場景:

巧用列舉來處理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() 獲得業務邏輯所需要的值

                //此處是你的業務邏輯
    }
});複製程式碼

相關文章