前回までで,
Twitterタイムラインは,
Wicketでは,
ListViewによるコンポーネントの繰り返し
ListViewはHTML要素を繰り返すときに使うコンポーネントです。ListViewに対応するwicket:idは,
リスト1 twitterスクリーンネーム一覧を表示するためのHTML
<table>
<tr wicket:id="repeatView">
<td wicket:id="userName">twitterのスクリーンネーム</td>
</tr>
</table>
この<tr>要素を繰り返すためのプログラムが、次のプログラムです。
リスト2 ListViewの使い方
ListView view = new ListView("id", new TwitterStatusListModel<List<Status>>()) {
@Override
protected void populateItem(final ListItem<Status> item) {
//itemが行を表すコンポーネント
//itemにコンポーネントをadd()することで,1行のコンポーネントを組み立てる
Status status = item.getModelObject();
item.add(new Label("userName", status.getUser().getScreenName()));
}
}
ListViewがデータを表示する際には,
ListViewに渡しているモデル
あとはStatusオブジェクトを使って1行分のコンポーネントを組み立てるだけです。ListItemにコンポーネントを追加することで、<tr>タグの子要素を組み立てることができます。
この例では,
LoadableDetachableModelでリクエスト中のキャッシュを行う
ListViewの作り方がおおよそ分かりました。しかし,
サンプルコード内のjp.
リスト3 Twitterのステータスリストを返すモデル
IModel<List<Status>> statusModel = new LoadableDetachableModel<List<Status>>() {
@Override
protected List<Status> load() {
try {
Twitter twitter = AppSession.get().getTwitterSession();
return twitter.getFriendsTimeline(new Paging(1, ITEMS_PER_PAGE));
} catch (TwitterException ex) {
MyTimeline.this.error(getString("canNotRetrieveFriendTimeline"));
return Collections.emptyList();
}
}
};
Statusクラスは,
ここでは,
LoadbaleDetachableModelクラスは,
Statusの取得
LoadbaleDetachableModelのload()メソッドをオーバーライドすることで,
サンプルでは,
getFriendsTimeline()は失敗する可能性がある操作です。失敗した場合にはTwitterExceptionがスローされますので,
また,
このモデルをListViewに渡すことで,
- ※1
- MyTimeline.
this. error()という表記を見慣れない方もいるでしょう。この記法はJavaの匿名サブクラスとローカルクラス特有のもので, 自分を取り囲む親オブジェクトのthisにアクセスするための記法です。もし単純にthis. error()と書いた場合, thisはLoadableDetachableModelオブジェクトを意味しますので, error()メソッド呼び出しはコンパイルエラーになります (LoadableDetachableModelにそのようなメソッドはないからです)。MyTimeline. thisを付けることで, MyTimelineオブジェクトのerror()を呼び出すことを明示しているのです。