ぱんぶろ

パンジーの「いいね!」ブログ

[Androidアプリ開発]2chまとめアプリ作成への道⑤~ITproのソースをちょっとイジる(ロジック編)~

      2016/03/30  

2chmatome

前回は、レイアウトを変更しました。
(⇒ITproのソースをちょっとイジる(レイアウト編)

このレイアウト変更に合わせて、中身のロジックも変更する必要があります。
そこで今回は、ITproアプリのロジックを少し変更していきます。

スポンサード リンク

ITproのソースをちょっとイジる(ロジック編)

前回のレイアウトの変更を簡単に振り返ると、

記事タイトル、記事概要の表示だったものを、

記事タイトル、記事概要、サイト名、更新日

に変更しました。

第一回目(⇒ITproのRSSリーダーを真似る)で作成したjavaファイルを、
このレイアウト変更に合わせて、変更していくことになります。

「Item.java」ファイルの変更

「Item.java」ファイルは、記事タイトルや、記事概要を格納するクラスで、
前回修正した「item_row.xml(レイアウトファイル)」との関連も強いです。

では実際に修正していきましょう。

【修正後】

package jp.co.nikkeibp.itpro.rssreader;

// Item.java
public class Item {
	// 記事のタイトル
	private CharSequence mTitle;
	// 記事のサイト名
	private CharSequence mSite;
	// 記事の更新日
	private CharSequence mDate;
	// 記事の本文
//	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;
	}

	public CharSequence getSite() {
		return mSite;
	}

	public void setSite(CharSequence site) {
		mSite = site;
	}

	public CharSequence getDate() {
		return mDate;
	}

	public void setDate(CharSequence date) {
		mDate = date;
	}
}

ソース内にある「mDescription」は記事概要に関する変数なので、
全て削除して新たにサイト名と更新日用の変数・メソッドを作成しました。

「RssParserTask.java」ファイルの変更

「RssParserTask.java」では、RSSフィード(xmlファイル)の中から各要素(記事タイトルや記事概要など)を取得しています。
その役目を行っているのが「parseXmlメソッド」です。

この「parseXmlメソッド」の中身を修正します。

【修正後】

// XMLをパースする
	public RssListAdapter parseXml(InputStream is) throws IOException,
			XmlPullParserException {
		XmlPullParser parser = Xml.newPullParser();
		try {
			parser.setInput(is, null);
			int eventType = parser.getEventType();
			Item currentItem = null;
			while (eventType != XmlPullParser.END_DOCUMENT) {
				String tag = null;
				switch (eventType) {
				case XmlPullParser.START_TAG:
					tag = parser.getName();
					if (tag.equals("item")) {
						currentItem = new Item();
					} else if (currentItem != null) {
						if (tag.equals("title")) {
							currentItem.setTitle(parser.nextText());
						} else if (tag.equals("author")) {
							currentItem.setSite((parser.nextText()));
						} else if (tag.equals("pubDate")) {
							currentItem.setDate((parser.nextText()));
						}
//						else if (tag.equals("description")) {
//							currentItem.setDescription(parser.nextText());
//						}
					}
					break;
				case XmlPullParser.END_TAG:
					tag = parser.getName();
					if (tag.equals("item")) {
						mAdapter.add(currentItem);
					}
					break;
				}
				eventType = parser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return mAdapter;
	}

記事概要(description)の取得を止め、
管理人(author)と更新日(pubDate)を取得するようにしました。

「RssListAdapter.java」ファイルの変更

「RssListAdapter.java」では、スマホ画面への表示を行ってます。
このクラスを修正していきます。

【修正後】

//RssListAdapter.java
public class RssListAdapter extends ArrayAdapter {
	private LayoutInflater mInflater;
	private TextView mTitle;
	private TextView mSite;
	private TextView mDate;
//	private TextView mDescr;

	public RssListAdapter(Context context, List 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 site = item.getSite().toString();
			mSite = (TextView) view.findViewById(R.id.item_site);
			mSite.setText(site);
			String date = item.getDate().toString();
			mDate = (TextView) view.findViewById(R.id.item_date);
			mDate.setText(date);
//			String descr = item.getDescription().toString();
//			mDescr = (TextView) view.findViewById(R.id.item_descr);
//			mDescr.setText(descr);
		}
		return view;
	}
}

フィールドの「mDescr」は記事概要に関連する変数なので、
削除しておきます。

代わりに「mSite(サイト名)」と「mDate(更新日)」を表示させます。

「RssReaderActivity.java」ファイルの変更

ここにも1ヶ所、記事概要に関する部分があるので削除しておきます。
「onListItemClickメソッド」内になります。

【修正後】

	// リストの項目を選択した時の処理
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		Item item = mItems.get(position);
		Intent intent = new Intent(this, ItemDetailActivity.class);
		intent.putExtra("TITLE", item.getTitle());
//		intent.putExtra("DESCRIPTION", item.getDescription());
		startActivity(intent);
	}

ItemクラスのgetDescription()メソッドは削除しているので、
ここでも削除しておきます。

以上です!実行してみましょう。

修正箇所は以上になります。
実際に実行してみましょう!
2chmatome20

前回変更したレイアウト通りに表示されているのが分かります。

まとめ

今回は、レイアウト変更に合わせてアプリのロジックを変更しました。

修正する箇所は似たりよったりなので、
表示させたい項目やレイアウトを変えたくなった場合でも、
柔軟に対応できるかと思います。

分からないことがあれば気軽に聞いてください。

今の時点でほぼほぼ完成ですが、まだ記事を選択した時にリンクに飛びません。
(タイトルだけが表示されるページに遷移する。)
なので次回は、記事選択時にリンク先へ遷移するように修正を加えていきます。
[NEXT]
[Androidアプリ開発(完結)]2chまとめアプリ作成への道⑥~ITproのソースをちょっとイジる(記事リンク編)~