package sample.lightbox.listview02;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String DEBUG_TAG = "ListView :";
MyArrayAdapter adapter = null;
// MyArratAdapter 用プライベートクラス
private class MyLinkData {
String myText;
String myUrl;
public MyLinkData(String myText, String myUrl) {
this.myText = myText;
this.myUrl = myUrl;
}
}
// ボタンが3つあるカスタム行をを使った MyLinkData 専用 ArrayAdapter
private class MyArrayAdapter extends ArrayAdapter<MyLinkData> {
// プライベートなので、コンストラクタに渡す情報はありません
public MyArrayAdapter() {
// スーパークラスに必要なのは、アクティビティのインスタンスのみ
super(MainActivity.this, 0);
}
// 一般的な getView 内のカスタマイズ
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
// ボタンが3つある行
rowView = inflater.inflate(R.layout.row, null);
}
// myText の表示
// Adapter の position の位置のデータを取得して、行の画面にセット
((TextView)rowView.findViewById(R.id.textView)).setText(adapter.getItem(position).myText);
Button button = (Button) rowView.findViewById(R.id.button);
Button button2 = (Button) rowView.findViewById(R.id.button2);
Button button3 = (Button) rowView.findViewById(R.id.button3);
// 初回のみイベント登録
if ( button.getTag() == null ) {
// ボタン A
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 最新の position を取得
int buttonPosition = (int) v.getTag();
// その position から データを取得
MyLinkData data = adapter.getItem(buttonPosition);
Toast.makeText(MainActivity.this,data.myText,Toast.LENGTH_SHORT).show();
}
});
// ボタン B
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 最新の position を取得
int buttonPosition = (int) v.getTag();
// その position から データを取得
MyLinkData data = adapter.getItem(buttonPosition);
Log.i(DEBUG_TAG, data.myText);
}
});
// ボタン C
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 最新の position を取得
int buttonPosition = (int) v.getTag();
// その position から データを取得
MyLinkData data = adapter.getItem(buttonPosition);
Toast.makeText(MainActivity.this,data.myUrl,Toast.LENGTH_SHORT).show();
}
});
}
// getView が呼び出されるという事は、その position が最新の状態なのでボタンに保存
// して、ボタンイベント内でその position を使用する
button.setTag(position);
button2.setTag(position);
button3.setTag(position);
return rowView;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// リストビューに表示させる情報
MyLinkData[] myLinks = {
new MyLinkData( "SQLの窓", "http://winofsql.jp" ),
new MyLinkData( "logical error", "http://logicalerror.seesaa.net/" ),
new MyLinkData( "琴線に触れる", "http://heart.winofsql.jp/"),
new MyLinkData( "GINPRO", "http://ginpro.winofsql.jp/"),
new MyLinkData( "SQLの窓 2", "http://winofsql.jp" ),
new MyLinkData( "logical error 2", "http://logicalerror.seesaa.net/" ),
new MyLinkData( "琴線に触れる 2", "http://heart.winofsql.jp/"),
new MyLinkData( "GINPRO 2", "http://ginpro.winofsql.jp/")
};
// リストビュー用のアダプターを作成
adapter = new MyArrayAdapter();
adapter.addAll(myLinks);
// リストビューを取得
ListView listView = (ListView) MainActivity.this.findViewById(R.id.listView);
// リストビューにデータ( アダプター ) をセット
listView.setAdapter(adapter);
// リストビューのアイテムがクリックされた時の処理
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
MyLinkData item = adapter.getItem(position);
// LogCatに表示
Log.i(DEBUG_TAG, item.myText);
Log.i(DEBUG_TAG, item.myUrl);
Log.i(DEBUG_TAG, Integer.toString(position));
// URL を開く
startActivity( new Intent(Intent.ACTION_VIEW, Uri.parse(item.myUrl)) );
}
});
}
}