編輯畫面需根據 myAccount.accountType 顯示對應的 Spinner 項目,而非預設第一項。
// 1. 將 enum 轉為顯示字串
String displayString;
switch (myAccount.accountType) {
case AccountType.kAccountTypeIncome: displayString = "Income"; break;
case AccountType.kAccountTypeAsset: displayString = "Asset"; break;
case AccountType.kAccountTypeAssetCash: displayString = "Cash"; break;
case AccountType.kAccountTypeAssetBank: displayString = "Bank"; break;
case AccountType.kAccountTypeLiability: displayString = "Liability"; break;
default: displayString = "Other";
}
// 2. 從 Adapter 取得位置並設定
int position = typeOfAccountAdapter.getPosition(displayString);
typeOfAccount.setSelection(position);
ArrayAdapter.getPosition(item):回傳項目在 Adapter 中的索引,找不到回傳 -1。Spinner.setSelection(position):程式化設定選中項,會觸發 OnItemSelectedListener。
// 定義資料模型
enum AccountType { Income, Asset, Cash, Bank, Liability, Other }
// Spinner 資料來源
List types = Arrays.asList(AccountType.values());
// 自定義 Adapter 顯示名稱
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, types) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
view.setText(getDisplayName(types.get(position)));
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
};
// 直接設定 enum 值
spinner.setSelection(types.indexOf(myAccount.accountType));
優勢:型別安全、重構友善、顯示邏輯集中、國際化容易。
getPosition 直接用 equals 比對。掌握 Adapter.getPosition() + Spinner.setSelection() 模式,是 Spinner 資料驅動顯示的標準做法。