SQLの窓

2017年04月15日


Tools クラスを使って Livedoor の お天気Webサービスを呼び出して Google gson でリストビューに一括で投入するとこうなります

関連する記事

13行目の Tools クラスに関しては以下を参照して下さい

Android Studio のテストの時間を短縮する為のいくつかの static メソッドをまとめた Tools クラス

簡単に使える API

Livedoor の お天気Webサービスは、特別な制限無く使える API で、しかもリストビューのテストには都合のいい、各地域の名前とその地域の天気の情報を表示する URL の配列を JSON 文字列から手に入れる事ができます。

リストビューは、オブジェクトの配列を addAll するだけで表示可能な手順があるので、そのオブジェクトを JSON 文字列から Google Gson に自動的に作ってもらっています。( Google Gson にとって、クラスのコンストラクタは必要ありません。この実装では、Google Gson 以外から追加する事を想定しています )

Google Gson

ダウンロード(GitHub)
Gson Download and Maven => Gson Download => Browse Central For => gson-x.x.x.jar  

オンラインドキュメント

Google Gson 用のクラス定義

Google Gson は、fromJson メソッドで、文字列の JSON と一致するクラス定義を使ってそのクラスのインスタンスを作成してくれます。クラス定義は必要な部分だけでよく、他のものは省略してかまいません。ここでは、PinpointLocation というクラスを定義して、その配列を JSON 文字列が対応しています。

PinpointLocation で注意するのは、ListView で表示して欲しい内容を toString メソッドを Override して定義しておく事です。

表示する以外の内容は、ListView をクリックした時のイベントで取得可能です。(97 〜 100 行)
package app.lightbox.winofsql.jp.listviewa;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import com.google.gson.Gson;
import jp.android.work.Tools;

public class MainActivity extends Activity {

	// Livedoor の お天気Webサービス用 (配列データ用)
	class PinpointLocation {
		String link;
		String name;
		public PinpointLocation(String myLink, String myName) {
			name = myName;
			link = myLink;
		}

		@Override
		public String toString() {
			return name;
		}
	}
	// Livedoor の お天気Webサービス用 (JSON用)
	class Weather {
		PinpointLocation[] pinpointLocations;
	}

	ListView listView = null;
	ArrayAdapter<PinpointLocation> adapter = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// リストビュー(PinpointLocation)用のアダプターを作成
		adapter =
			new ArrayAdapter<PinpointLocation>(
					MainActivity.this,
					android.R.layout.simple_list_item_1
			);

		// ボタンがクリックされたら読み込み
		Button button = (Button) this.findViewById(R.id.button);
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// 単純確認メッセージボックス
				Tools.messageBox(MainActivity.this, "API呼び出し", "実行しますか?", new Tools.OnMessageBoxListener() {
					@Override
					public void onMessageBoxYesListener() {

						// データをセット
						Tools.callHttpGet(
							"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
							"utf-8",
							new Tools.OnAsyncTaskListener() {
								@Override
								public void onAsyncTaskListener(String s) {

									Gson gson = new Gson();
									Weather weatherData = gson.fromJson(s, Weather.class);
									adapter.clear();
									adapter.addAll(weatherData.pinpointLocations);
									// リストビューに適用
									listView.setAdapter(adapter);

								}
							}
						);
					}

					@Override
					public void onMessageBoxNoListener() {
						Log.i("lightbox","キャンセルしました");
					}
				});

			}
		});

		// リストビューのアイテムがクリックされた時の処理
		listView = (ListView) MainActivity.this.findViewById(R.id.listView);
		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

				// クリックされたアイテムを取得
				PinpointLocation mydata = (PinpointLocation) parent.getItemAtPosition(position);
				// LogCatに表示
				Log.i("lightbox", mydata.name);
				Log.i("lightbox", mydata.link);

				// URL を開く
				Tools.callBrowser(MainActivity.this, mydata.link);

			}
		});
	}

}


関連する記事

Android の単純な ListView の ArrayAdapter による応用の効く 4バリエーション と複数項目に即対応できる SimpleAdapter による実装



【Android Studio 1の最新記事】
posted by lightbox at 2017-04-15 01:37 | Android Studio 1 | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり