SQLの窓

2013年09月28日


Android 単純リストビューを google-gson で最速構築



このままでは使い物にはなりませんが、基本コードとしてのテンプレートになります。ですから、この後、ListView と Gson 用クラスををカスタマイズして項目を増やしていくだけでリストビューの部分の作成は容易になります。
package com.example.listviewobjectjson;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;

import com.google.gson.Gson;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MyListview extends Activity {
	
	private Gson gson = null;
	private WebGet task;
	private JSON_STRING js;
	private ArrayAdapter<MyObject> basicAdapter;
	
	// ************************************************************
	// Android 用初期処理
	// ************************************************************
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_my_listview);

		Button button = (Button) findViewById(R.id.button1);
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// AsyncTask に引数を与えて呼び出す
				// 1) doInBackground, 2) onProgressUpdate, 3) onPostExecute
				task = new WebGet();
				task.execute( "http://10.0.2.2/lightbox/php_json/log.php" );
			}
		});
 	}
	
	// ************************************************************
	// Android 用非同期処理
	// ************************************************************
	private class WebGet extends AsyncTask<String, String, String> {
		
		// ここは使っていません
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}
		
		// *******************************************************
		// UI スレッド側の処理 ( 引数は JSON 文字列 )
		// *******************************************************
		@Override
		protected void onPostExecute(String result) {
			// UI スレッドとして処理される
			System.out.println(result);

			// gson インスタンス
			gson = new Gson();
			
			// JSON を クラスインスタンスに変換
			js = gson.fromJson(result,JSON_STRING.class);
			
			// js.item は List<MyObjecyt>
			basicAdapter = new ArrayAdapter<MyObject>(
					MyListview.this,
					R.layout.textview,
					js.item
			);
			
			// リストビューにアダプタをセット
			ListView listView = (ListView)MyListview.this.findViewById(R.id.listView1);
			listView.setAdapter(basicAdapter);			

		}

		// *******************************************************
		// 非同期スレッドの呼び出し
		// *******************************************************
		@Override
		protected String doInBackground(String... aurl) {

			Log.i("MyListview2:","開始");
			String json_string = "";

			try {

				// 引数の URL を使用して実行
				URL url = new URL(aurl[0]);
				// 接続オブジェクト( getInputStream をする為のもの )
				HttpURLConnection http = (HttpURLConnection)url.openConnection();
				http.setConnectTimeout(30000);
				http.setReadTimeout(30000);
				http.setRequestMethod("GET");
				
				// 以下読み込み3セット
				InputStream i_stream = http.getInputStream();
				// UTF-8 でリーダーを作成
				InputStreamReader i_stream_reader = new InputStreamReader(i_stream, "UTF-8");
				// 行単位で読み込む為の準備   
				BufferedReader b_reader = new BufferedReader(i_stream_reader);
				
				// 行の一括読みこみ
				String line_buffer;   
				// BufferedReader は、readLine が null を返すと読み込み終了 
				while ( null != (line_buffer = b_reader.readLine() ) ) {   
					// コマンドプロンプトに表示   
					json_string += line_buffer;
				}
	 
				// 後処理
				b_reader.close();
				i_stream_reader.close();
				i_stream.close();

				http.disconnect();
			}
			catch (Exception e) {
				e.printStackTrace();
			}
			
			// JSON 文字列を onPostExecute に対して送る
			return json_string;
		}

	}	
	
	// ************************************************************
	// GSON で使う為の JSON 文字列の構造を定義したクラス
	// ************************************************************
	private class JSON_STRING {
		List<MyObject> item;
	}

	private class MyObject {
		String text;
		
		// 単純リストビューなので、toString で 内容を返すようにしておく
		public String toString() {
			return this.text;
		}
	}
	
	// ************************************************************
	// メニュー( 未使用 )
	// ************************************************************
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_my_listview, menu);
		return true;
	}
}


関連する記事

Android をテストするのにほんの少し楽になるかもしれないクラス
( このクラスでもう少しコードがすっきりします )



【Androidの最新記事】
posted by lightbox at 2013-09-28 23:19 | Android | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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