アクティビティを実装する

 さて、いよいよアプリケーションの根幹となるアクティビティの実装に入る。まずは「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オブジェクトを格納しているので、表示される画面も非常にそっけないものである。

図4●空のリストビューを描画したところ
図4●空のリストビューを描画したところ
[画像のクリックで拡大表示]

 以上、Androidアプリケーション開発の実際の流れと、ロジックの実装に着手するまでの部分を駆け足で説明してきた。いかがだっただろうか。次回からは、RSSリーダー・アプリの中核部分となるRSSパーサの機能を中心に解説していく予定だ。

中川善樹(なかがわよしき)
アシアル株式会社 エンジニア
中川善樹(なかがわよしき)Web開発,中でもPHPでの開発に目覚めアシアルに入社。現在ではPHPでのシステム開発に加え,Ajax技術を用いたRIA(rich internet application)開発,iPhoneやAndroidなどのスマートフォン開発も手がけ,ユーザビリティの高いサイト作りに気を配る。Android版の「Abacus」など,最新のアプリケーションをいち早く市場に投入することを目指している。