コメント |
@DIV
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;
}
}
@END |