RSS2.0形式のフィードからタイトルの一覧を取得してきてListViewで表示するというプログラムを作った。前回はCanvasに描画にしていたが、それのListView版。フィードの取得をやってるスレッドは今のところ一つしか作って無いので、問題にならないが、インスタンス変数にアクセスしてるので、複数のスレッドからアクセスする場合は排他制御が必要だろう。あとListViewに必要なListAdapterを実装したクラスだが、今回はBaseAdapterを利用した。継承していくつかメソッドをオーバーライドする必要があるので、今回はArrayAdapterの方が楽そうだが…まぁ、作ってしまった物は仕方がない
package test.rss; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.view.Window; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.TextView; import android.widget.BaseAdapter; import android.graphics.Color; import android.util.Xml; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.util.List; import java.util.ArrayList; import java.net.URL; import java.net.URLConnection; import java.net.MalformedURLException; import java.io.IOException; public class RSSTest extends Activity implements Runnable{ //タイトル表示用リストビュー private ListView listView; //リストビューに表示させる内容一覧とビュー private RSSAdapter adapter; //取得するRSSのURL private static final String RSS_URL = "http://d.hatena.ne.jp/d-kami/rss2"; //接続先の文字コード private static final String CHARACTER_CODE = "UTF-8"; //GUI関係のアクセス用 private Handler handler; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = new ListView(this); adapter = new RSSAdapter(this); handler = new Handler(); listView.setBackgroundColor(Color.WHITE); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(listView); //RSSを取得するスレッドの開始 Thread thread = new Thread(this); thread.start(); } public void run(){ adapter.clear(); try{ XmlPullParser parser = Xml.newPullParser(); //URLを指定して接続 URL url = new URL(RSSTest.RSS_URL); URLConnection connect = url.openConnection(); parser.setInput(connect.getInputStream(), RSSTest.CHARACTER_CODE); int eventType; while((eventType = parser.next()) != XmlPullParser.END_DOCUMENT){ //itemタグを見つけたらaddItemへ if(eventType == XmlPullParser.START_TAG && "item".equals(parser.getName())){ addItem(parser); } } }catch(MalformedURLException e){ adapter.addTitle(e.getMessage()); }catch(XmlPullParserException e){ adapter.addTitle(e.getMessage()); }catch(IOException e){ adapter.clear(); adapter.addTitle(e.getMessage()); } handler.post(new Runnable(){ public void run(){ listView.setAdapter(adapter); } }); } private void addItem(XmlPullParser parser) throws XmlPullParserException, IOException{ while(true){ int eventType = parser.next(); //itemのエンドタグを見つけたらループ終了 if(eventType == XmlPullParser.END_TAG && "item".equals(parser.getName())){ break; } //titleタグを見つけたらテキストを取り出す if(eventType == XmlPullParser.START_TAG && "title".equals(parser.getName())){ eventType = parser.next(); if(eventType == XmlPullParser.TEXT){ adapter.addTitle(parser.getText()); } } } } //リストビューに表示させるデータとビュー private static class RSSAdapter extends BaseAdapter{ private final Context context; private final List<String> titleList; private RSSAdapter(Context context){ this.context = context; titleList = new ArrayList<String>(); } private void addTitle(String title){ titleList.add(title); } private void clear(){ titleList.clear(); } public int getCount(){ return titleList.size(); } public Object getItem(int position){ return titleList.get(position); } public long getItemId(int position){ return position; } public View getView(int position, View convertView, ViewGroup parent){ TextView textView = new TextView(context); textView.setTextSize(16f); textView.setText(titleList.get(position)); return textView; } } }