なか日記

一度きりの人生、楽しく生きよう。

ArrayAdapterをつかったカスタムリスト

ListViewで自分の好きなレイアウト、データで表示したいときにはArrayAdapterを継承したクラスを使います。

SampleAdapterクラス

public class SampleAdapter extends ArrayAdapter<Book> {

    private Context _context;
    private int _textViewResourceId;
    private List<Book> _items;
    private LayoutInflater _inflater;

    public SampleAdapter(Context context, int textViewResourceId, List<Book> items) {
        super(context, textViewResourceId, items);

        _context = context;
        _textViewResourceId = textViewResourceId;
        _items = items;

        _inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if (convertView != null) {
            view = convertView;
        } else {
            view = _inflater.inflate(_textViewResourceId, null);
        }

        Book item = _items.get(position);

        ((TextView) view.findViewById(R.id.title)).setText(item.getTitle());
        ((TextView) view.findViewById(R.id.isbn)).setText(item.getIsbn());

        return view;
    }
}

ListViewがスクロールして新しい行が表示されるタイミングでArrayAdapter#getViewが呼び出されますが、このとき表示されなくなったViewが引数に渡されてくるので再利用してます。
起動時のまっさらな状態ならxmlからLayoutInflaterを使ってViewを生成してます。
詳細は「Adapter#getViewの挙動について - hyoromoのブログ」でまとめられているのでそちらをどうぞ。


以降は使い方のサンプルです。

CutomListSampleActivity

Bookクラスを作成して、一覧をリストに表示させてます。

public class CutomListSampleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ArrayList<Book> books = new ArrayList<Book>();
        Book book;
        for (int i = 0; i < 1000; i++) {
            book = new Book();
            book.setTitle("Title" + String.valueOf(i));
            book.setIsbn("ISBN:" + String.valueOf(i));
            books.add(book);
        }

        SampleAdapter adapter = new SampleAdapter(this, R.layout.samplerow, books);

        ListView lv = (ListView) findViewById(R.id.booklist);
        lv.setAdapter(adapter);
    }
}

samplerow.xml

リスト1行分のレイアウトです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:orientation="vertical">

	<TextView
		android:id="@+id/title"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:textSize="19dip"
		/>
	<TextView
		android:id="@+id/isbn"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:textSize="15dip"
		/>
</LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:id="@+id/booklist">
</ListView>

Bookクラス

データを保存する際に使用するクラスです。

public class Book {
    private String _isbn;
    private String _title;

    public String getIsbn() {
        return _isbn;
    }

    public void setIsbn(String isbn) {
        this._isbn = isbn;
    }

    public String getTitle() {
        return _title;
    }

    public void setTitle(String title) {
        this._title = title;
    }
}