List 屬於 MIDP 高層 API,繼承自 Screen,實作 Choice 介面,用於顯示可選擇的字串清單,可選搭配圖示。所有高層 UI 類別均在 javax.microedition.lcdui 套件中。
| 常數 | 行為 | 視覺隱喻 |
|---|---|---|
List.EXCLUSIVE | 單選:同一時間僅能選取一項,選新項自動取消舊項 | 單選按鈕 |
List.MULTIPLE | 多選:可同時選取零項或多項 | 核取方塊 |
List.IMPLICIT | 隱含選擇:外觀如單選,但選取動作會觸發 SELECT_COMMAND 事件 | 功能表項目 |
// 方式一:逐項新增
List list = new List("Choose fruit:", List.EXCLUSIVE);
list.append("Orange", null);
list.append("Apple", null);
list.append("Pear", null);
// 方式二:陣列一次建構
String[] fruits = {"Orange", "Apple", "Pear"};
List list2 = new List("Choose fruit:", List.EXCLUSIVE, fruits, null);
圖示為選用,實現方可能忽略;傳入 null 最安全。
EXCLUSIVE 與 MULTIPLE 模式下,使用者瀏覽不會產生事件,必須註冊至少一個 Command 並設定 CommandListener 才能接收動作。IMPLICIT 模式下,選取項目會自動送出 List.SELECT_COMMAND。
list.setCommandListener(this); // 實作 CommandListener
public void commandAction(Command c, Displayable d) {
if (c == List.SELECT_COMMAND) {
// IMPLICIT 模式下的選取處理
} else if (c == exitCmd) { ... }
}
List 提供 append、insert、delete、set 等方法,可隨時修改項目。清除所有項目範例:
public static void deleteAll(List l) {
int n = l.size();
while (n-- > 0) l.delete(n);
}
亦可繼承 List 擴充 deleteAll() 方法。
getSelectedIndex() 回傳索引(-1 表無選取)。getSelectedFlags(boolean[]) 將各項選取狀態寫入陣列;或逐項檢查 isSelected(index)。setSelectedIndex(index, true) 或 setSelectedFlags(boolean[])。Image.createImage("/path.png") 從 JAR 載入,或離屏緩衝動態生成。public class ListDemo extends MIDlet implements CommandListener {
private Display display;
private int mode = List.IMPLICIT;
private Command exitCmd = new Command("Exit", Command.SCREEN, 2);
private Command selectCmd = new Command("Select", Command.OK, 1);
private Command nextCmd = new Command("Next", Command.SCREEN, 2);
private static final String[] ITEMS = {"First","Second","Third","Fourth"};
protected void startApp() {
if (display == null) {
display = Display.getDisplay(this);
display.setCurrent(new SampleList(mode));
}
}
// pauseApp、destroyApp、exitMIDlet 略...
class SampleList extends List implements CommandListener {
SampleList(int mode) {
super("", mode, ITEMS, null);
addCommand(exitCmd); addCommand(selectCmd); addCommand(nextCmd);
setCommandListener(this);
switch(mode) {
case IMPLICIT: setTitle("Implicit"); break;
case EXCLUSIVE: setTitle("Exclusive"); break;
case MULTIPLE: setTitle("Multiple"); break;
}
this.mode = mode;
}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) exitMIDlet();
else if (c == selectCmd) showSelection(false);
else if (c == List.SELECT_COMMAND) showSelection(true);
else if (c == nextCmd) {
if (mode == List.IMPLICIT) mode = List.EXCLUSIVE;
else if (mode == List.EXCLUSIVE) mode = List.MULTIPLE;
else mode = List.IMPLICIT;
display.setCurrent(new SampleList(mode));
}
}
private void showSelection(boolean implicit) {
Alert alert = new Alert(implicit ? "Implicit Selection" : "Explicit Selection");
StringBuffer buf = new StringBuffer();
if (mode == MULTIPLE) {
boolean[] sel = new boolean[size()];
getSelectedFlags(sel);
for (int i=0;i0) buf.append(", ");
else buf.append("You selected: ");
buf.append(getString(i));
}
if (buf.length()==0) buf.append("No items are selected.");
} else {
buf.append("You selected ").append(getString(getSelectedIndex()));
}
alert.setString(buf.toString());
alert.setTimeout(Alert.FOREVER);
display.setCurrent(alert, display.getCurrent());
}
}
}