Warning: include(/home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-content/advanced-cache.php): failed to open stream: No such file or directory in /home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-settings.php on line 74

Warning: include(/home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-content/advanced-cache.php): failed to open stream: No such file or directory in /home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-settings.php on line 74

Warning: include(): Failed opening '/home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-content/advanced-cache.php' for inclusion (include_path='.:/usr/local/php/5.4/lib/php') in /home/users/2/lolipop.jp-a-virtual/web/dhmo/dhmo/wp-settings.php on line 74
【Android開発】オリンピックをRSSで見てみよう|RSSアプリつくったった。 – Androidアプリつくったった

【Android開発】オリンピックをRSSで見てみよう|RSSアプリつくったった。

rss-android-アプリ
『ソチオリンピック』後10日だったんですね。

BBCの動画いい感じのだったのでまずは紹介します。

今回は地理的関係上、ライブでは見られそうもありませんので
RSSニュースアプリを作りました。
 
▼ ココからインストール可能です。(もちろん無料です)
olympic
 

XMLのエラーは分かりにくい

製作中下記のように分かりにくいエラーが出ましたが
StackoverFlowに答えが載ってました。drawableフォルダにアイコンファイル入れるの忘れてました。

W/ResourceType( 6884): ResXMLTree_node size 0 is smaller than header size 0x45.

 

RSSの機構のソースを載せておきます

基本的に一般的なRSSのソースだと思いますが、
ざっとソースを公開します。((--〆))
メインの方はちょっと実はあることを施策中です。
 

取りたい変数の1セットをまとめる

Item.javaは実にシンプルです。
取りたい項目のコンストラクターとゲッター&セッターのみです。

public class Item {

    private CharSequence mTitle;
    private CharSequence mDescription;

	public CharSequence getLink() {
		return mLink;
	}
	public void setLink(CharSequence mLink) {
		this.mLink = mLink;
	}
	private CharSequence mLink;

    public Item() {
        mTitle = "";
        mDescription = "";
        mLink="";
    }

    public CharSequence getDescription() {
        return mDescription;
    }

    public void setDescription(CharSequence description) {
        mDescription = description;
    }

    public CharSequence getTitle() {
        return mTitle;
    }

    public void setTitle(CharSequence title) {
        mTitle = title;
    }
}

 

続いてアダプターの部分です。
1行分をセットしてあげている機構ですね。
 
 


public class RssListAdapter extends ArrayAdapter<Item> {
    private LayoutInflater mInflater;
    private TextView mTitle;

    public RssListAdapter(Context context, List<Item> objects) {
        super(context, 0, objects);
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @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 = this.getItem(position);
        if (item != null) {
            String title = item.getTitle().toString();
            mTitle = (TextView) view.findViewById(R.id.item_title);
            mTitle.setText(title);
        }
        return view;
    }
}

 

XMLから特定の内容を抽出する

RSSの肝ですね。Android3.0以降ではUIスレッドでのネットワーク通信が
NGなので、AsyncTaskとして実行します。
 

public class RssParserTask extends AsyncTask<String, Integer, RssListAdapter> {
    private RssReader mActivity;
    private RssListAdapter mAdapter;
    private ProgressDialog mProgressDialog;

    public RssParserTask(RssReader activity, RssListAdapter adapter) {
        mActivity = activity;
        mAdapter = adapter;
    }


    @Override
    protected void onPreExecute() {
        mProgressDialog = new ProgressDialog(mActivity);
        mProgressDialog.setMessage("Now Loading...");
        mProgressDialog.show();
    }

    @Override
    protected RssListAdapter doInBackground(String... params) {
        RssListAdapter result = null;
        try {
            URL url = new URL(params[0]);
            InputStream is = url.openConnection().getInputStream();
            result = parseXml(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(RssListAdapter result) {
        mProgressDialog.dismiss();
        mActivity.setListAdapter(result);
    }

    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("description")) {
                            currentItem.setDescription(parser.nextText());
                        }else  if (tag.equals("link")){
                        	currentItem.setLink(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;
    }

    public void stopDialog(){
    	mProgressDialog.dismiss();
    }
}

 
以上です。
 
参考になれば

About the Author

dhmo
Author:DHMO(ディベロッパー名) 仕事では自社サービス・メディアの開発を行ってます。 趣味でAndroidアプリ製作を行っています。 カラオケではランキングバトルにはまっております。 Mail: dihydromooxide7@gmail.com 

Be the first to comment on "【Android開発】オリンピックをRSSで見てみよう|RSSアプリつくったった。"

Leave a comment

Your email address will not be published.


*