アクティビティを実装する
さて、いよいよアプリケーションの根幹となるアクティビティの実装に入る。まずは「Item」クラスを定義しておこう。Itemクラスは前述した通り、取得したRSSデータのなかの個々の記事データの構造を表している。実装作業は単純で、個々のデータを格納するためのフィールドとアクセサメソッドを定義する。
// Item.java
public class Item {
// 記事のタイトル
private CharSequence mTitle;
// 記事の本文
private CharSequence mDescription;
public Item() {
mTitle = "";
mDescription = "";
}
public CharSequence getDescription() {
return mDescription;
}
public void setDescription(CharSequence description) {
mDescription = description;
}
public CharSequence getTitle() {
return mTitle;
}
public void setTitle(CharSequence title) {
mTitle = title;
}
}
次に、先ほどレイアウトの定義をしたリストビューを画面に表示させる。以下はメインとなるアクティビティの例である。
// RssReaderActivity.java
public class RssReaderActivity extends ListActivity {
private ArrayList- mItems;
private RssListAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Itemオブジェクトを保持するためのリストを生成し、アダプタに追加する
mItems = new ArrayList
- ();
mAdapter = new RssListAdapter(this, mItems);
// アダプタをリストビューにセットする
setListAdapter(mAdapter);
// サンプル用に空のItemオブジェクトをセットする
for (int i = 0; i < 10; i++) {
mAdapter.add(new Item());
}
}
}
リストビューを利用するアクティビティでは、Activityクラスのサブクラスである「ListActivity」クラスを継承する。また、第2回で説明したように、アプリケーションの実行時に最初に呼び出されるのが「onCreate」メソッドである。このonCreate内で、先ほど定義したmain.xmlを「setContentView」メソッドで設定し、後述する独自クラス「RssListAdapter」にセットする。
RssListAdapterには、RSSデータのパース結果となる「Itrem」オブジェクトを格納した「ArrayList」がセットされている。こうして、生成されたアダプタは、「setListAdapter」メソッドによりアクティビティにセットできるようになる。つまり、パース済のデータと、アクティビティ内に表示されるリストビューは、このアタプタを介して「橋渡し」されるわけだ。
さて、以下の例では「ArrayAdapter」クラスを継承した「RssListAdapter」という独自のクラスを定義している。
// RssListAdapter.java
public class RssListAdapter extends ArrayAdapter<Item> {
private LayoutInflater mInflater;
private TextView mTitle;
private TextView mDescr;
public RssListAdapter(Context context, List<Item> objects) {
super(context, 0, objects);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
// 1行ごとのビューを生成する
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
view = mInflater.inflate(R.layout.item_row, null);
}
// 現在参照しているリストの位置からItemを取得する
Item item = this.getItem(position);
if (item != null) {
// Itemから必要なデータを取り出し、それぞれTextViewにセットする
String title = item.getTitle().toString();
mTitle = (TextView) view.findViewById(R.id.item_title);
mTitle.setText(title);
String descr = item.getDescription().toString();
mDescr = (TextView) view.findViewById(R.id.item_descr);
mDescr.setText(descr);
}
return view;
}
}
手順は少し煩雑になるが、このように独自のアダプタをカスタマイズすることで、TextView以外の様々なビューを追加することができるので、応用性が高いやり方である。ちなみに、ITproのRSSリーダー・アプリでも、リストの各行の左端にImageViewを追加してサムネイル画像を表示させている。
リストの各行を生成するときにコールされるのが「getView」メソッドだ。このgetViewメソッド内で「LayoutInflater」クラスの「inflate」メソッドをコールし、res/layout/main.xmlで定義したレイアウトリソースを生成(インフレート)している。そしてgetItemメソッドで、現在参照している位置のItemを取り出し、Itemに格納された記事のタイトルと本文を、各段のTextViewにそれぞれセットしている。
これを実行してみて、次のような画面が生成されれば成功である。現時点で、リストには空のItemオブジェクトを格納しているので、表示される画面も非常にそっけないものである。
以上、Androidアプリケーション開発の実際の流れと、ロジックの実装に着手するまでの部分を駆け足で説明してきた。いかがだっただろうか。次回からは、RSSリーダー・アプリの中核部分となるRSSパーサの機能を中心に解説していく予定だ。
アシアル株式会社 エンジニア