基本上ListView並不具備捲動功能,因此必須將之附屬於ScrollPane元件之中,ScorllPane會自動依據內容的多寡而調整元件的高度,UI設計人員無須介入。更詳細的ScrollPane介紹留待以後說明。本範例由官網取得。
============範例展示=================================================
============範例展示=================================================
ListView的內容來源是指定在listData屬性中,而以JSON字串陣列的方式來描述。ui.bxml如下:(ListViews類別仍然是放在myex#ListViews)
<!--ui.bxml-->
<myex:ListViews title="List Views" maximized="true"
xmlns:bxml="http://pivot.apache.org/bxml"
xmlns:myex="myex"
xmlns="org.apache.pivot.wtk">
<Border>
<BoxPane styles="{padding:4, spacing:4}">
<Border styles="{color:10}">
<ScrollPane preferredWidth="120" preferredHeight="110"
horizontalScrollBarPolicy="fill"
verticalScrollBarPolicy="fill_to_capacity">
<ListView bxml:id="listView" selectMode="multi"
listData="['第一個ListItem','第二個ListItem',
'第三個ListItem','第四個ListItem','第五個ListItem',
'第六個ListItem','第七個ListItem','第八個ListItem',
'第九個ListItem','第十個ListItem']"/>
</ScrollPane>
</Border>
<BoxPane orientation="vertical" preferredWidth="120" styles="{fill:true}">
<Label text="你的選擇有:"/>
<Label bxml:id="selectionLabel" styles="{wrapText:true}"/>
</BoxPane>
</BoxPane>
</Border>
</myex:ListViews>
接下來是myex#ListViews類別,它主要繼承了Window類別,並實作Bindable介面,以處理ListViewSelection事件。在範例程式碼中,有針對Span及Sequence做了簡單的說明。
#ListViews.java
package myex;
import java.net.URL;
import org.apache.pivot.beans.Bindable;
import org.apache.pivot.collections.Map;
import org.apache.pivot.collections.Sequence;
import org.apache.pivot.util.Resources;
import org.apache.pivot.wtk.*;
import org.apache.pivot.wtk.content.ListItem;
public class ListViews extends Window implements Bindable {
private Label selectionLabel = null;
private ListView listView = null;
@Override
public void initialize(Map<String, Object> namespace, URL location, Resources resources) {
selectionLabel = (Label) namespace.get("selectionLabel");
listView = (ListView) namespace.get("listView");
//ListViewSelection事件處理
listView.getListViewSelectionListeners().add(new ListViewSelectionListener() {
@Override
public void selectedRangeAdded(ListView listView, int rangeStart, int rangeEnd) {
//使用者使用多重選擇Ctrl+L-Click加入某個選項
updateSelection(listView);
}
@Override
public void selectedRangeRemoved(ListView listView, int rangeStart, int rangeEnd) {
//使用者移除某個選擇
updateSelection(listView);
}
@Override
public void selectedRangesChanged(ListView listView, Sequence<Span> previousSelectedRanges) {
//使用者選擇狀態發生改變->加入或移除某個選項
if (previousSelectedRanges != null
&& previousSelectedRanges != listView.getSelectedRanges()) {
//如果尚未選擇過(例如:程式一開始執行)或是選項沒有改變就不更新
updateSelection(listView);
}
}
@Override
public void selectedItemChanged(ListView listView, Object previousSelectedItem) {
// No-op
}
//自訂method,用來將使用者選的選項顯示在右方的Label中
private void updateSelection(ListView listView) {
String selectionText = "";
//Span類別是用來儲存一定範圍的整數值
//Sequence則是Pivot中用來表示有序項目的集合元件
//使用者可能不是連續選取ListView的項目,而是跳著選
//因此ListView#getStlectedRanges()可能會取得多個Span
//而每個Span都包含了許多個連續選取的項目索引
Sequence<Span> selectedRanges = listView.getSelectedRanges();
for (int i = 0, n = selectedRanges.getLength(); i < n; i++) {
//取得其中的Span
Span selectedRange = selectedRanges.get(i);
for (int j = selectedRange.start;
j <= selectedRange.end;
j++) {
if (selectionText.length() > 0) {
selectionText += ", ";
}
Object item = listView.getListData().get(j);
String text;
if (item instanceof ListItem) {
//如果是圖片(ListItem)
text = ((ListItem) item).getText();
} else {
//純文字內容(listData)
text = item.toString();
}
selectionText += text;
}
}
selectionLabel.setText(selectionText);
}
});
}
}
最後的程式進入點和先前的NewClass.java都相同,就不再重覆。
============範例展示 2=================================================
============範例展示 2=================================================
第二個範例則展示了ListView中使用ListItem(包含圖片及文字)的功能,ui2.bxml如下:
<!--ui2.bxml-->
<myex:ListViews title="List Views with Images" maximized="true"
xmlns:bxml="http://pivot.apache.org/bxml"
xmlns:content="org.apache.pivot.wtk.content"
xmlns:myex="myex"
xmlns="org.apache.pivot.wtk">
<Border>
<BoxPane styles="{padding:4, spacing:4}">
<Border styles="{color:10}">
<ScrollPane preferredWidth="80" preferredHeight="110"
horizontalScrollBarPolicy="fill"
verticalScrollBarPolicy="fill_to_capacity">
<ListView bxml:id="listView" selectMode="multi"
>
<itemRenderer>
<content:ListViewItemRenderer iconWidth="16" iconHeight="16"
showIcon="true"
/>
</itemRenderer>
<content:ListItem icon="/anchor.png" text="Anchor"/>
<content:ListItem icon="/bell.png" text="Bell"/>
<content:ListItem icon="/clock.png" text="Clock"/>
<content:ListItem icon="/cup.png" text="Cup"/>
<content:ListItem icon="/house.png" text="House"/>
<content:ListItem icon="/star.png" text="Star"/>
</ListView>
</ScrollPane>
</Border>
<BoxPane orientation="vertical" preferredWidth="120" styles="{fill:true}">
<Label text="You selected:"/>
<Label bxml:id="selectionLabel" styles="{wrapText:true}"/>
</BoxPane>
</BoxPane>
</Border>
</myex:ListViews>
No comments:
Post a Comment