マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

ListViewを使ってみる

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;
         }
    }
}