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