ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
MyListview.java ( No.1 )
日時: 2013/10/13 20:38
名前: lightbox



拡張子:
package com.example.listviewobjectjson;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import com.google.gson.Gson;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.EditText;

public class MyListview extends Activity {
	
	private Gson gson = null;
	private JSON_STRING js = null;
	private CustomAdapter basicAdapter = null;
	
	// ImageView 用
	private Drawable[] image_icon = new Drawable[100];
	private int counter = 0;	
	
	// ************************************************************
	// Android 用初期処理
	// ************************************************************
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_my_listview);

		// ボタンのイベントの登録
		((Button)MyListview.this.findViewById(R.id.button1))
		.setOnClickListener(new View.OnClickListener() {

			// ボタンがクリックされた時の処理
			@Override
			public void onClick(View v) {

				// 未入力時の検索文字列
				String text = ((EditText)MyListview.this.findViewById(R.id.editText1)).getText().toString();
				if ( text.equals("") ) {
					text = "消費税";
				}
				
				// new オブジェクト(アクセストークンリスト).Search("検索文字列",MAX件数,検索終了イベント)
				new TwitterSearch(
					"Consumer key",
					"Consumer secret",
					"Access token",
					"Access token secret"
				).Search(text, 20, new TwitterSearch.Searched() {
					
					// 検索が終了した時の処理( String result に結果の JSON )
					@Override
					public void onSearchResult(String result) {
						System.out.println(result);

						// gson インスタンス
						gson = new Gson();
						
						// JSON を クラスインスタンスに変換
						// ※ 結局 JSON の処理はこの一行
						js = gson.fromJson(result,JSON_STRING.class);

						// 画像を件数ぶん保存( インターネットアクセスになるので非同期
						// 処理の AsyncTask をインラインで記述 )
						// 引数は、JSON_STRING 型のオブジェクト
						// 第3引数は未使用( 引渡しが必要無かったので )
						new AsyncTask<JSON_STRING, Void, String>() {

							// 非同期処理( 画像を件数ぶん保存 )
							@Override
							protected String doInBackground(JSON_STRING... params) {

								counter = 0;
								for (TwitterSearchObject item : params[0].statuses) {
									URL url;
									try {
										System.out.println(item.user.profile_image_url);
										url = new URL( item.user.profile_image_url );
										InputStream is = (InputStream)url.getContent();
										image_icon[counter] = Drawable.createFromStream(is, "");
									} catch (Exception e) {
										e.printStackTrace();
									}
									counter++;
								}
								
								return null;
							}

							// 画像が保存完了した後に ListView に設定する
							// (終了後でないと、リストビューの最初の画像が表示されない)
							@Override
							protected void onPostExecute(String param) {
								// js.statuses は List<TwitterSearchObject>
								basicAdapter = new CustomAdapter(
										MyListview.this,
										R.layout.listview_item,
										js.statuses
								);
								
								// リストビューにアダプタをセット
								ListView listView = (ListView)MyListview.this.findViewById(R.id.listView1);
								listView.setAdapter(basicAdapter);			
							}							
							
						}.execute(js);	// クラス作成後メソッドを実行
						
					}
				});				
			}
		});
		
		((ListView)MyListview.this.findViewById(R.id.listView1))
		.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				ListView listView = (ListView) parent;
				TwitterSearchObject item = (TwitterSearchObject) listView.getItemAtPosition(position);
				Toast.makeText(getApplicationContext(), item.text,
						Toast.LENGTH_LONG).show();
			}
		});	
		
 	}
	
	
	// ************************************************************
	// GSON で使う為の JSON 文字列の構造を定義したクラス
	// ************************************************************
	private class JSON_STRING {
		List<TwitterSearchObject> statuses;
	}

	private class TwitterSearchObject {
		String text;
		UserObject user;
	}
	
	private class UserObject {
		String name;
		String screen_name;
		String profile_image_url;
	}
	

	
	// ************************************************************
	// 専用アダプタの作成
	// ************************************************************
	public class CustomAdapter extends ArrayAdapter<TwitterSearchObject> {

		private LayoutInflater builder;
		private int curResourceId;

		public CustomAdapter(Context context, int textViewResourceId, List<TwitterSearchObject> objects) {
			super(context, textViewResourceId, objects);
			curResourceId = textViewResourceId;
			builder = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// 特定の行(position)のデータを得る
			TwitterSearchObject item = (TwitterSearchObject)getItem(position);

			// convertViewは使い回しされている可能性があるのでnullの時だけ新しく作る
			if (null == convertView) {
				convertView = builder.inflate(curResourceId, null);
			}
			
			// ************************************************************
			// 各項目のセット
			// ************************************************************
			// 名前
			((TextView)convertView.findViewById(R.id.textView1))
			.setText(item.user.name);

			// 投稿文
			((TextView)convertView.findViewById(R.id.textView2))
			.setText(item.text);

			// 表示名
			((TextView)convertView.findViewById(R.id.textView3))
			.setText(item.user.screen_name);

			// 画像をセット
			if ( image_icon[position] != null ) {
				((ImageView)convertView.findViewById(R.id.imageView1))
				.setImageDrawable(image_icon[position]);
			}
			
			return convertView;
		}
	}
	
	
	// ************************************************************
	// メニュー( 未使用 )
	// ************************************************************
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_my_listview, menu);
		return true;
	}
}