🧩 Adapterパターンの復習(Java編)
■ Adapterパターンとは?
「既存のクラスのインターフェースを、別のインターフェースに変換する」デザインパターンです。
つまり、**互換性のないクラス同士をつなぐ“橋渡し”**をするのが目的です。
■ Javaでの例
// 既存のクラス(変更できない)
class OldPrinter {
void printText(String text) {
System.out.println("印刷: " + text);
}
}
// 使いたいインターフェース
interface NewPrinter {
void print(String message);
}
// Adapterクラス
class PrinterAdapter implements NewPrinter {
private OldPrinter oldPrinter;
public PrinterAdapter(OldPrinter oldPrinter) {
this.oldPrinter = oldPrinter;
}
@Override
public void print(String message) {
oldPrinter.printText(message); // 互換性のある呼び出しに変換
}
}
Adapterはあくまで“変換係”。使いたい形に「合わせる」ことで再利用性を高めます。
📱 Androidにおける Adapter の役割
Androidでは、ListView
や RecyclerView
にデータを表示する時に、必ず Adapter を使います。
なぜなら:
- **データ(Listなど)**はプログラム上に存在する
- **UI(View)**は画面に描画される
👉 その 「データ → UI」への橋渡しが、Androidにおける Adapter
の役割です。
🎨 AndroidのAdapter 実装例(ListView
)
たとえば、以下のようなリストを表示したいとします:
List<String> items = Arrays.asList("りんご", "バナナ", "みかん");
■ ArrayAdapter を使う例
ListView listView = findViewById(R.id.listView);
ArrayAdapter<String> adapter = new ArrayAdapter<>(
this,
android.R.layout.simple_list_item_1,
items
);
listView.setAdapter(adapter);
items
: データのリストsimple_list_item_1
: 1行のレイアウトArrayAdapter
: データを1行のテキストに変換する変換器(=Adapter)
ArrayAdapter
は簡易版。複雑なデータ表示にはRecyclerView.Adapter
を使います。
🔁 RecyclerView.Adapter
の実装(より現代的)
RecyclerView はより高速で柔軟なリスト表示コンポーネントで、Adapterの実装が必須です。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> dataList;
public MyAdapter(List<String> list) {
this.dataList = list;
}
// 1. 表示用のViewを生成
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(android.R.layout.simple_list_item_1, parent, false);
return new ViewHolder(view);
}
// 2. Viewにデータをバインド
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.textView.setText(dataList.get(position));
}
// 3. アイテム数を返す
@Override
public int getItemCount() {
return dataList.size();
}
// ViewHolderの定義
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public ViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(android.R.id.text1);
}
}
}
💡 Adapter実装のポイントまとめ
項目 | 説明 |
---|---|
Adapter | データと表示をつなぐ橋渡し |
ViewHolder | 各行のViewの保持者(findViewByIdを毎回しないための最適化) |
onCreateViewHolder() | 各アイテムのView生成 |
onBindViewHolder() | 各アイテムへのデータバインド |
getItemCount() | アイテム数の取得 |
🔚 まとめ
- JavaのAdapterパターンと同様、Androidでも「形式の変換」と「仲介役」がキーワード。
- AndroidのAdapterは、「データ(Listなど)」と「View(UI部品)」の接着剤のような役割を持つ。
ListView
ではArrayAdapter
を、より柔軟なRecyclerView
では独自のAdapter
を実装。