Androidでリスト表示するならArrayAdapter | sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

Androidでリスト表示をする場合は
ListViewを使うのは当然なのだけれど、
テキストや画像を表示する場合は一筋縄ではいかない。

ちなみに文字をリスト表示させるだけであれば
こんな感じで終わる。

"Activity"を拡張したクラスで次の処理を行う。

//ListViewのインスタンスを生成
ListView listView = (ListView) findViewById(R.id.listView1);

//ArrayAdapterのインスタンスを生成
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    android.R.layout.simple_list_item_1);

//adapterに要素を追加する。
adapter.add("hoge");

// adapterをリストに追加
listView.setAdapter(adapter);

行数増やしたい場合は
adapter.add();を繰り返せば良い。

しかし、リストの項目を少し複雑にする場合は別。
まず、継承するクラスをActivityから"ListActivity"に変更する。

public class TestActivity extends ListActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //表示する要素をリストで用意する。
        ArrayList<Fuga> list = new ArrayList<Fuga>();
        setApplicationList(list);

        HogeAdapter hogeAdp = new HogeAdapter(this, R.layout.main, list);
        setListAdapter(hogeAdp);
    }
    
    private void setApplicationList(ArrayList<Fuga> fugaList){
        //fugaリストを生成する
        Fuga fuga = new Fuga();
        fuga.setName("tarou");
        fuga.setMessage("Hello!");
        fugaList.add(fuga);
    }
}

上のクラスでやることといえば、
1.表示したい項目をArrayList型で用意すること。
2.用意したリストを設定するAdapterクラス(後述)を用意すること。
3.リストを設定したAdapterクラスを設定(setListAdapter)すること。
という感じです。

次にArrayAdapterクラスを継承したクラスを用意する。

public class HogeAdapter extends ArrayAdapter {

    private ArrayList<Fuga> items;
    private LayoutInflater inflater;

    public HogeAdapter(Context context, int textViewResourceId,
            ArrayList<Fuga> items) {
        super(context, textViewResourceId, items);
        this.items = items;
        this.inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        // ビューを受け取る
        View view = convertView;
        if (view == null) {
            // 受け取ったビューがnullなら新しくビューを生成
            view = inflater.inflate(R.layout.main, null);
        }
        
        //viewから必要な要素を取得して値を設定する。
        TextView name = (TextView) view.findViewById(R.id.textView1);
        TextView message = (TextView) view.findViewById(R.id.textView2);
        ImageView image = (ImageView) view.findViewById(R.id.imageView1);
        
        if (items != null && items.size() >= position) {
            name.setText(items.get(position).getName());
            message.setText(items.get(position).getMessage());
            image.setImageResource(R.drawable.ic_launcher);
        }
        
        return view;
    }
}

Adapterクラスでやることは、
コンストラクタの設定と、getViewでの表示設定。
コンストラクタはActivityから受け取るリストを設定する必要がある。
またgetViewではViewの設定と、Viewに配置されている各項目の設定。

今回はリスト表示される項目をFugaクラスを使って
ActivityとAdapterクラス間でやりとりしたけれど、
ArrayListを使えば、オブジェクトは何でも良いと思われる。
Fugaクラスの内容はDTOやEntityのような構成で、
単に変数とgetter、setterがあるというだけなので、
特筆して内容は載せず、省略致します。