目次
リスト項目のカスタマイズ(CustomAdapter)
ToDoリストアプリを作る。
予め用意したToDoをクリックするとToDoが消える仕様。
ToDoに必要なフィールドを保持するToDoクラスを作成。
各ToDoのViewを表示するためのxmlとインフレータのJavaを作る。
CustomAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import 色々; public class CustomAdapter extends BaseAdapter { Context context; ArrayList<Todo> lists; LayoutInflater inflater; public CustomAdapter(Context context,ArrayList<Todo> lists) { super(); this.context = context; this.lists = lists; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return lists.size(); } @Override public Todo getItem(int position) { return lists.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View view, ViewGroup parent) { Todo td = lists.get(position); Holder holder; if (view==null) { view = this.inflater.inflate(R.layout.row, null); holder = new Holder(); holder.iv = (ImageView) view.findViewById(R.id.imageView1); holder.toDo = (TextView) view.findViewById(R.id.textTodo); holder.limit = (TextView) view.findViewById(R.id.textLimit); } else { holder = (Holder) view.getTag(); } if (td != null) { holder.iv.setImageResource(td.id); holder.toDo.setText(td.toDo); holder.limit.setText(td.limit); } return view; } class Holder { ImageView iv; TextView toDo; TextView limit; } } |
BaseAdapterのメソッドをオーバーライドしている。
データを保持するための内部クラスHolderを用意して、
Viewが存在しない時に項目データを取得する。
Main表示を作る
activity_main.xmlにListViewを配置
Mainのjava書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import 色々; public class MainActivity extends Activity { ListView lv; ArrayList<Todo> list=new ArrayList<Todo>(); CustomAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); makeDate(); addEvent(); } private void findView() { lv=(ListView)findViewById(R.id.listView1); } private void makeDate() { list.add(new Todo(R.drawable.image_a, "本を読む", "12/28")); list.add(new Todo(R.drawable.image_b, "映画を見る", "12/31")); list.add(new Todo(R.drawable.image_c, "初詣", "2014/1/1")); adapter = new CustomAdapter(this,list); lv.setAdapter(adapter); } private void addEvent() { lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { list.remove(position); lv.setAdapter(adapter); if (list.size()==0) { Toast.makeText(MainActivity.this, "やることないよ 完", Toast.LENGTH_SHORT).show(); } } }); } } |
ArrayListを作ってCustomAdapterに変換。
クリックするたびにremoveしてadapterをsetし直して表示をし直す。
全部無くなったら「ToDoが無い」旨を知らせる。
実行結果
画面遷移させる。
サブ画面の用意
ファイル > 新規 > その他 > Androidアクティビティー > アクティビティの表示方法選択 > アクティビティ名決定 > 完了
初期表示の設定
AndroidManifest.xmlに下記のコードが入っているアクティビティが初期表示となる
1 2 3 4 5 |
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> |
サブ画面へ行く
ボタンを押すとSubActivityを立ち上げる
1 2 3 4 5 6 7 8 9 10 |
private void addEvent() { btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SubActivity.class); startActivity(intent); } }); } |
Intentは複数のアクティビティやアプリを繋ぐようなものらしい。
第一引数がcontext,第二引数がクラス
コードはSubActivity.javaに行くためのコード
メイン画面に戻る
ボタンを押したらSubActivity.javaを終了(finishメソッド)させる。
1 2 3 4 5 6 7 8 9 |
private void addEvent() { btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); } |
メイン画面からサブ画面に情報を届ける(putExtra)
1 2 3 4 5 6 7 8 9 10 11 |
private void addEvent() { btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(MainActivity.this,SubActivity.class); intent.putExtra("name", et.getText().toString()); startActivity(intent); } }); } |
putExtraメソッドでIntentに値を持たせる。
第一引数は任意のキー,第二引数は持たせるデータ。
サブ画面でIntentの情報を受け取る
1 2 3 4 5 6 7 8 9 |
private void findView() { tv = (TextView) findViewById(R.id.textView1); btn = (Button) findViewById(R.id.button1); Intent i = this.getIntent(); name = i.getStringExtra("name"); tv.setText("ようこそ" + name + "さん"); } |
getIntentで起動に使ったIntentを取得。
getStringExtraで指定したキーに格納されている(mainで”name”に引き渡した)文字列を取得。
ボタンを押す処理を簡単にする
OnClickListenerインターフェイスを実装する。
以前と同様にゴリゴリやらなくてよくなる。
実際にインターフェイスを実装した「計算させるアプリ」のコード(MainActivityのみ)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import 色々; public class MainActivity extends Activity implements OnClickListener { EditText et1; EditText et2; Button btn1; Button btn2; Button btn3; Button btn4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); } private void findView() { et1 = (EditText) findViewById(R.id.editText1); et2 = (EditText) findViewById(R.id.editText2); btn1 = (Button) findViewById(R.id.button1); btn1.setOnClickListener(this); btn2 = (Button) findViewById(R.id.button2); btn2.setOnClickListener(this); btn3 = (Button) findViewById(R.id.button3); btn3.setOnClickListener(this); btn4 = (Button) findViewById(R.id.button4); btn4.setOnClickListener(this); } public void onClick(View v) { if (et1.getText().toString().equals("") || et2.getText().toString().equals("")) { Toast.makeText(MainActivity.this, "入力に不備があります", Toast.LENGTH_SHORT).show(); } else { double result = 0; double num1 = Double.parseDouble(et1.getText().toString()); double num2 = Double.parseDouble(et2.getText().toString()); switch (v.getId()) { case R.id.button1: result = num1 + num2; break; case R.id.button2: result = num1 - num2; break; case R.id.button3: result = num1 * num2; break; case R.id.button4: result = num1 / num2; break; } Intent intent = new Intent(MainActivity.this, SubActivity.class); intent.putExtra("calc", result); startActivity(intent); } } } |
サブからメインに情報を引き継ぐ
メインコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import 色々; public class MainActivity extends Activity { public static final int RC = 1; //RequestCodeは1以上のint型 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bt = (Button) findViewById(R.id.button1); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SubActivity.class); startActivityForResult(intent, RC); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==RC && resultCode==RESULT_OK){ String name=data.getStringExtra("name"); Toast.makeText(MainActivity.this, name + "さんこんにちは!", Toast.LENGTH_SHORT).show(); } } } |
サブ画面のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import 色々; public class SubActivity extends Activity { EditText et; Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); findView(); addEvent(); } private void findView() { et = (EditText) findViewById(R.id.editText1); bt = (Button) findViewById(R.id.button1); } private void addEvent() { bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("name", et.getText().toString()); setResult(RESULT_OK,intent); finish(); } }); } } |
コードについては後で読み解く・・・・気力ぷー・・・・
今日のひとこと
- あくびしてるけど俺つまんないかな?
- Context周りはあまり突っ込んで欲しくない・・・・(困
コメント
No Trackbacks.