[Android] BaseAdapterで画像とテキストをListView表示

ArrayAdapterを使えば手軽に作れる ListView ですが、画像とテキストのリストなど色々と細かく作りこみたい場合はカスタムでadapterを作成することになります。BaseAdapterを継承してカスタムでadapterを作るケースを試してみます。
 

    ArrayAdapter

  1. ListView と ArrayAdapter 簡単なテキストリストの表示
  2. ArrayAdapterを使ってレイアウトをアレンジ
  3. ListActivity と ArrayAdapterで画像とテキストをリスト表示
    Basedapter

  1. BaseAdapterで画像とテキストをリスト表示
  2. ListViewリストをタップして画面遷移
  3. ListViewアイテムの移動、削除
  4. ListView アイテム個々の背景、高さなどを変える


 

Android Studio 2.3.3
Android 7.1.1

BaseAdapter

 
BaseAdapterを継承したクラスは3つあります。

  1. SimpleAdapter
  2. ArrayAdapter
  3. CursorAdapter

単純なテキストリストはArraAdapterを使ったほうが簡単です。込み入ったレイアウトにしてい時はBaseAdapterを使ったほうがいいでしょう。
 
カスタムadapterを作成する手順としては:

  • BaseAdapterを継承したクラスを作成
  • getView() メソッドをオーバライト
  • リスト項目のレイアウトをカスタマイズ

基本的なBaseAdapterの構造は

  • getCount(): 配列やListの要素数を返す
  • getItem(): indexやオブジェクトを返す
  • getItemId(): 特別なIDをindexの他に返す
  • getView(): setImageBitmap() など、ここで描画させている

実際に作っていきたいと思います。
 
MainActivity.java

 
新しいTestAdapterクラスをprojectに作成します。
TestAdapter.java

 
レイアウトファイル
activity_main.xml

 
新しくLayout XMLファイルをlayout以下に作成します。
list_items.xml

 

 
リスト数が10個程度だとあまり気にならないのですが、画像を貼り付けてリスト数が数百になると、あるいはリストを増やせる仕様のケースでは、スクロールが重くなり最終的には Out Of Memory で終了…となる可能性があります。
 
描画負荷を減らし、高速にするための手法として

 
if (convertView == null){

}else{

}
の部分で convetView がnullでなければ再利用する
– Inflate()
– findViewById()
は省略され、ViewHolder の children view が使用されます。

テキストのリストであれば問題ないかもしれませんが、画像を扱うListViewではこれは必須です。

 
References:
ListView
BaseAdapter