2011年9月14日水曜日

Adapterとは何か

Adapterとは何か

概要
Adapterは、文字列や画像などの複数のデータと、(AdapterViewから派生した)ListView等との中間に存在し、両者の橋渡しをする役割を担います。

他のViewとの違い
Viewとして良く使うものに、ButtonやTextViewなどがあります。これらは、特に問題なく使えるでしょう。
訳が分からないのがListViewです。ListViewをxmlで書く例は次のとおりです。
<?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="wrap_content" 
    >
    <ListView
        android:id="@+id/ListView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:fastScrollEnabled="true"
        >
    </ListView>
</LinearLayout>

この書き方は、ButtonやTextViewと良く似た書き方です。このため、ButtonやTextViewと同じ振る舞いをするかのような錯覚を持ちます。この錯覚が、理解を困難にしているのだと思います。

ListViewは、上記のように1個しか書いていません。しかし、このListViewにAdapterを結びつけることによって、AdapterのデータがListViewに表示される仕組みになっています。この結びつける作業は、javaで書きます。
1個しか書いていないんだけど、実際には、複数のデータが表示されるのです。

詳細
Adapterは、全てのViewで使えるのではなく、AdapterViewから派生したViewに限って使えるのです。
AdapterViewは、ViewGroupから派生したクラスです。ViewGroupは複数のViewを取り扱うViewです。このことから、(1個ではなく)複数のデータを表示する場合に、Adapterを使うものだと理解できます。
AdapterViewから派生してできたクラスとして、GridView, ListView, Spinner等があります。当然、これらのViewはViewGroupでもあるのです。

参考に、ListViewの階層図を示しておきます。


java.lang.Object
   ↳android.view.View
   ↳android.view.ViewGroup
   ↳android.widget.AdapterView<T extends android.widget.Adapter>
   ↳android.widget.AbsListView
   ↳android.widget.ListView

GridView, ListView, Spinner等を使う場合にAdapterも併せて使うことになります。
ただし、取扱うデータの数が、3~4個程度であり、少なければ、ViewGroupを使わずに、Viewを1個1個単体で作っていけばよろしくて、その場合、Adapterは使えません。

表示するデータの並べ替えや表示順序などの指定も、Adapterが執り行うこととなっています。このことから、ListView等を扱うプログラマーは、Adapterに関する理解が必須になるのです。Adapterを使わねばならなくなった時に、あたふたーしないようにしましょう。

Adapterには次の種類があります。
  1. ListAdapter....1個の行に1個の列を作成します。Listを使ってデータを挿入します。
  2. SimpleAdapter....1個の行に複数の列を作成できます。Mapを使って1行単位のデータを作成します。Listを使ってデータを挿入します。
  3. SimpleCursorAdapter....取扱うデータをデータベースから取得します。

0 件のコメント:

コメントを投稿