店舗一覧をリストで表示
店舗一覧情報のリスト表示を実装します。まず、地図面からリストビューに遷移する際に渡していたAPIの検索結果をgetIntent()で取得します。ArrayListをIntentで渡す際は、データを作る時にSerializableにしておくことでintentで渡すことができます。
続いて、APIの検索結果の中からリストビューに必要な情報を抜き出してArrayList<SearchList>に渡します。今回は表示する要素が複数あったため、Androidのデフォルトリストビューを使わずに独自のレイアウトを作成しました。
ArrayList<SearchList>に店舗ごとの表示要素を渡し終わったら、それをSearchListAdapterにセットします。このAdapterの内部は受け取ったデータからリストビューのアイテムのViewを作成して返します。
// 地図面から渡した検索結果を取得(Serializeして持ってくる)
Intent intent = getIntent();
m_innerData = (ArrayList<InnerSearchData>) intent.getSerializableExtra("RESULT");
InnerSearchData result = m_innerData.get(0);
// ヘッダに表示する文言の取得
TextView textView = (TextView)findViewById(R.id.header_building);
String building = result.getBuildingName() + "(全" + result.getBuildingFloor() + "フロア)";
// 施設名と総フロア数を表示
textView.setText(building);
// 検索結果から表示する際に使う要素をListデータに渡す
list = new ArrayList<SearchList>();
for(int i = 0; i < m_innerData.size(); i++) {
InnerSearchData resultItem = m_innerData.get(i);
SearchList setItem = new SearchList();
// 店舗名
setItem.setName(resultItem.getName());
// ユニークID
setItem.setUid(resultItem.getUid());
// ジャンル名
setItem.setGenreName(resultItem.getGenreName());
// 電話番号
setItem.setTel(resultItem.getTel());
list.add(setItem);
}
// ListAdapter に要素を渡す
ListAdapter searchListAdapter = new SearchListAdapter(getApplicationContext(), list);
ListView listView = (ListView)findViewById(R.id.searchlist_listview);
// ListView に別途作ってあるadapter をセットする
listView.setAdapter(searchListAdapter);
店舗ページを表示
店舗を一覧表示できましたが、これだけだとお店の詳細がわかりませんよね? レスポンスには店舗ごとのユニークIDも含まれているので、最後にこの情報を使って、該当するお店のYahoo!ロコ店舗ページをブラウザで表示してみましょう。リストビューの何番目がタップされたかをonItemClickの第3引数になっているpositionから取得します。後はlist.get(position).getUid()でユニークIDを取得して遷移先のURIを作ってIntentで飛ばすだけです。
// ListView のアイテムをタップした時の挙動
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// URI の作成
String url = "http://loco.yahoo.co.jp/place/" + list.get(position).getUid() + "/";
Uri uri = Uri.parse(url);
// 遷移先を指定してブラウザで表示する
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// ブラウザの起動
startActivity(intent);
}
});
おわりに
いかがでしたでしょうか。連載1回目の「YOLPで挑戦~Android向け簡易道のり測定アプリを30分で作る!」では、「Yahoo! AndroidマップSDK」が持つ機能の範囲内でできることを行いましたが、今回は追加で「施設内検索API」を使用し、少しリッチな情報を扱ってみました。YOLPでは「施設内検索API」に限らず、他にも多数のリッチな情報を扱っているAPIが公開されています。今回アプリを作成する時に使ったYOLPのAPIリクエストライブラリと位置情報取得ライブラリを使えば、他のAPIを使ったアプリも手軽に作成できると思いますので挑戦してみてください。
なお、今回使用したソースコードはこちらからダウンロードできますので、ぜひお試しください。
5月24日にアップデート公開された「地図 Yahoo!ロコ」では、今回紹介した施設内検索機能を使って、主要施設内の店舗を検索できるようになりました。ぜひGoogle Playからダウンロードしてお試しください。
