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 による実装



posted by lightbox at 2017-04-15 01:37 | Android Studio 1 | このブログの読者になる | 更新情報をチェックする

2017年04月11日


PHP : ${'日本語表示'} という可変変数と、${hello . "X"} という連結可変変数

※ hello という定数が無いという通知が出る環境では、error_reporting 関数で抑制できます
※ 結果が PHP の認識できる文字列であればいいので、"hello" . (10 * 4) もありです。
※ PHP の可変変数

以下のコードは全て正しく動作しますが、最後の連想配列を除いて、変数名を可変で表現する可変変数のサンプルです。

PHP が変数として許している文字は制限がありますので、$2011/07/08 と言う変数はエラーになりますが、${'2011/07/08'} という変数は正しく動作します。
JavaScript で var a = {}; a["2017/01/01"] = "001"; として、参照が a.2017/01/01 ができないのと同様で、JSON を PHP 内で変換して使う時にも意識するといいです
つまり、日本語を変数として使いたい場合は、${'日本語表示'} という書き方で確実に使える事になります。 日本語は、その構成文字が「キャラクタセット」によって変わるので、どの文字が実際 PHP で変数として使えるかどうかは、はっきり言えませんが、実際使えるものもたくさんあります。しかし、確実では無いので${'日本語表示'}という表現は選択肢のうちの一つです。 また、PHP のマニュアルの投稿内容にありましたが、${文字 . "文字列"} という書き方が何故か正常に動作します。
<?php
error_reporting(E_ALL ^ E_NOTICE);

// $a に値をセット
$a = 'hello';

// $a を変数名として利用
${$a} = 'world (1)';

// world (1) が表示されます
print $hello . "<br>";


// ★ もう少し複雑な場合(1)

// $b[1] に値をセット
$b[1] = 'hello';

// $b[1] を変数名として利用
${$b[1]} = 'world (2)';

// world (2) が表示されます
print $hello . "<br>";


// ★ もう少し複雑な場合(2)

// $c に値をセット
$c = 'hello2';

// $c を変数名として利用
${$c}[1] = 'world (3)';

// world (3) が表示されます
print $hello2[1] . "<br>";


// ★ 文字列の接続

${hello . "X"} = 'world (4)';

// world (4) が表示されます
print $helloX . "<br>";


// ★ エラーにならない特殊な変数
// ※ $2011/07/08 という変数は作れません

$d = '2011/07/08';
${$d} = 'world (5)';

// world (5) が表示されます
print ${'2011/07/08'} . "<br>";


// ★ 日本語変数
// キャラクタセットによって、PHPが使える文字なら
// $日本語表示 でもエラーにはなりません 

$e = '日本語表示';
${$e} = 'world (6)';

// world (6) が表示されます
print ${'日本語表示'} . "<br>";

${'日本語表示'} .= " 追加OK";
print $$e . "<br>";

// ★ 連想配列による日本語表現

$f['日本語表示'] = 'world (7)';

// world (7) が表示されます
print $f['日本語表示'] . "<br>";

?> 




posted by lightbox at 2017-04-11 15:22 | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



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

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