全てのソースコード 仕様の概略1) MainActivity には ListView コントロールのみ 2) ListView 内に TextView は縦に2項目 3) NextActvity には、元へ戻るボタンと TextView が一つ※ MyArrayAdapter を private で 一つのソースに記述しています。 ➡ インターネットから JSON データを取得して ListView に表示します (https://lightbox.sakura.ne.jp/homepage/demo/data/csvtype/json.php) ➡ インターネットへのアクセスは、tools.jar の Tools.callHttpGet を使用します。 ➡ 読み出した JSON 文字列を Google Gson でデシリアライズして、JsonDataList にセットします。( リンク先には クラス定義があります ) ➡ このオブジェクトを ArrayAdapter<JsonData> を継承した MyArrayAdapter にセットし、ListView に MyArrayAdapter をセットして ListView を表示します。 ➡ ListView には、setOnItemClickListener で行をクリックしたイベントを定義し、その中で 行データを Intent にセットして次画面へ移動します。 ➡ 次画面では、受け取った行データより、本文を取得して画面の TextView へ表示します。 MainActivity
public class MainActivity extends AppCompatActivity { private final int MY_REQUEST_CODE = 1000; private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // リストビューの取得 listview = (ListView) MainActivity.this.findViewById(R.id.listView); // リストビューの行をタップした時の処理 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // アダプターを取得 MyArrayAdapter adapter = (MyArrayAdapter)parent.getAdapter(); // 行データを取得 JsonData json = (JsonData)adapter.getItem(position); // 引渡しデータを作成 Intent intent = new Intent(MainActivity.this,NextActivity.class); intent.putExtra("DATA","こんにちは"); // Serializable インターフェイスなのでまとめて渡す intent.putExtra("OBJECT",json); // 画面移動 MainActivity.this.startActivityForResult(intent,MY_REQUEST_CODE); } }); // JSON データの URL String json_url = "https://lightbox.sakura.ne.jp/homepage/demo/data/csvtype/json.php"; // tools.jar の static メソッド Tools.callHttpGet(json_url, "utf-8", new Tools.OnAsyncTaskListener() { @Override public void onAsyncTaskListener(String s) { // JSON データをデシリアライズ Gson gson = new Gson(); JsonDataList jdl = gson.fromJson(s, JsonDataList.class); // アダプタを作成して、データをセット MyArrayAdapter adapter = new MyArrayAdapter(MainActivity.this,R.layout.list_item); // jdl.item は配列 adapter.addAll(jdl.item); // リストビューにデータを表示 listview.setAdapter(adapter); } }); } // ****************************** // 次画面から戻って来た時の処理 // ****************************** @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if ( requestCode == MY_REQUEST_CODE ) { // NextActivity の 戻るボタン以外で戻ると 0 Log.i("lightbox",String.format("NextActivity からの戻り値 : %d", resultCode)); if ( data != null ) { String message = data.getStringExtra("DATA"); Log.i("lightbox",String.format("NextActivity からのメッセージ : %s", message)); } } } // ****************************** // JsonData を格納する、この処理専用の // ArrayAdapter のカスタマイズ // ****************************** private class MyArrayAdapter extends ArrayAdapter<JsonData> { // コンストラクタで渡された画面の保存 private int mResource; public MyArrayAdapter(Context context, int resource) { super(context, resource); // ArrayAdapter でも、このようにして保存して利用してます mResource = resource; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // 現在の View の取得 LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService (Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(mResource, null); } // アダプターより行データを取得 JsonData json = MyArrayAdapter.this.getItem(position); // 画面にデータをセット TextView tv; // Subject tv = (TextView) convertView.findViewById(R.id.textItem1); tv.setText(json.getSubject()); // Name tv = (TextView) convertView.findViewById(R.id.textItem2); tv.setText(json.getName()); // 行の画面をシステムに返す return convertView; } } }
MainActivity での特記事項 ● onItemClick 内での 行データの参照は、parent.getAdapter() によって、使用しているアダプターを取得します。 ● JsonData は、そのまま Intent にセットする為に Serializable インターフェイスを実装しています ● JsonData へのデータのセットは、Google Gson 経由を想定しているので、setter および コンストラクタは定義していません ● JsonData の getText 以外のメソッドはここでは使用しませんが、仕様の拡張を想定した最低限必要と判断したものです。特に、toString は、システムが用意した一つの項目しかない行を定義した画面で使う為に必要です(ここでは必要ありません)。 ● MyArrayAdapter で画面 id を内部保存しているのは、ArrayAdapter のソースコードに準じたものです ● tools.jar は、ソースコードを簡略化する為のテスト用のライブラリです。本番には相応のコードを用意します。 NextActivity
public class NextActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_next); // 引き渡された Intent を取得 Intent intent = NextActivity.this.getIntent(); // 文字列のデータを取り出す String message = intent.getStringExtra("DATA"); Log.i("lightbox",String.format("MainActivity からのメッセージ : %s", message)); // Serializable オブジェクトを取り出す JsonData json = (JsonData) intent.getSerializableExtra("OBJECT"); // 画面へデータをセット TextView tv = (TextView) NextActivity.this.findViewById(R.id.textView); // text データ上の 改行文字列を実際の改行に変換する String text = json.getText(); text = text.replace("\\n", "\n"); tv.setText(text); // MainActivity へ戻る為のボタン Button button = (Button) NextActivity.this.findViewById(R.id.backButton); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 戻る時にも Intent を引き渡す Intent intent = new Intent(); intent.putExtra("DATA", "今戻りました"); // MainActivity で受け取る int データをセットする NextActivity.this.setResult(NextActivity.RESULT_OK,intent); // この画面を終了して MainActivity へ戻る NextActivity.this.finish(); } }); } }
NextActivity での特記事項 Android Studio では、New => Activity で作成しており、AndroidManifest への定義は自動的に追加されます。 全てのソースコード
|
【Android Studio 2の最新記事】
- Android : WebView 経由のデータベースアプリケーション
- Android で WebView を使ってWEBにあるデータベースのデータを取得する為のクラス
- WebView で JavaScript にデータを渡したい時に注意する事
- シンプル Android Data Binding : Android Studio 2.2 / 古い定義との違いと、以前のプロジェクトでエラーが出る場合の対処
- Android : Data Binding で ListView へのデータ表示を凄く簡単にする
- Android Studio で理解不能なエラーが出た時の対処方法 : Invalidate Caches / Restart
- Android : TabHost のタブに下から上へのアニメーションを設定して、include で同一画面を使用するので 回転しないように AndroidMainfest で設定する
- Android : TabHost 内の各 TabSpec 内にある TextView の 端末回転時における保存と復帰
- Android の 端末回転時の EditText と TextView の違い
- ViewPager 内のイベントで設定した TextView の値を保持する Fragment 処理
- ExpandableListView を使用して、タップした時に明細データ表示する
- カスタム・リストビュー・ダイアログ : DialogFragment 内の ListView を ArrayAdapter でカスタムする
- カスタム・リストビュー・ダイアログ : ダイアログ内の ListView を ArrayAdapter でカスタムする
- AlertDialog.Builder の setItems(int itemsId, DialogInterface .OnClickListener listener) を使用した、ListVie..
- AsyncTask<Params, Progress, Result> の Progress を無しにして、onPostExecute 内の処理を interface を使って MainA..
- javamail-android + AsyncTask でメール送信を行う為のテンプレート
- tools.jar の callHttpGet のテストと include による画面再利用と HttpPost クラスで掲示板書き込み / Android Studio
- Android の Spinner に関するいろいろな実装と知識 / Android Studio
- AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio
- Android Studio が 2.0 になりました。前からの内容も含めて整理してます。