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

Android7 

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

    ArrayAdapter

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

  1. BaseAdapterで画像とテキストをリスト表示
  2. ListViewリストをタップして画面遷移
  3. ListViewアイテムの移動、削除


 

Android Studio 2.2.2
Android 7.1.1
sponsored link

BaseAdapter

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

  1. SimpleAdapter
  2. ArrayAdapter
  3. CursorAdapter

単純なテキストリストはArraAdapterを使ったほうが簡単です。込み入ったレイアウトにしてい時は大元のBaseAdapterを使ったほうがいいでしょう。その他のadapterは使いたいケースをあまり思いつきません(個人的見解)。
 
カスタムadapterを作成する手順としては:

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

基本的なBaseAdapterの構造は

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

実際に作っていきたいと思います。アイコンの画像を用意してもいいのですが、システムとしてすでに登録されているアイコンを使えば画像分のメモリーが節約されます。
例:
android.R.drawable.ic_btn_speak_now


screen-shot-2016-10-04-at-11-53-38

 
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