ホーム >  Android > ListView(BaseAdapter)

Android -ListView(BaseAdapter)-

ListView(BaseAdapter)

BaseAdapterクラスを継承したクラスには、ArrayAdapter・CursorAdapter・SimpleAdapterクラスがあります。

BaseAdapterクラスを拡張し、独自のAdapterクラスを定義、getViewメソッドをオーバーライドすることで、リスト項目の レイアウトを自由にカスタマイズすることができます。

ポイントは、getViewでリスト項目を1列表示する度に、毎回新しいウィジェットを作成せず、初回に作成した後は、再利用します。

getView の 最適化の参考サイト:Y.A.M の 雑記帳


サンプル

ListViewEx11

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/lsit_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


res/layout/list_row.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"
    android:background="#ffffff"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/flag_image"
        android:layout_width="40dp"
        android:layout_height="30dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="5dp"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/flag_code"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#000000" />

        <TextView
            android:id="@+id/flag_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:textColor="#000000" />
    </LinearLayout>

</LinearLayout>


ListViewEx11.java

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class ListViewEx11 extends Activity {

  //国番号
  String[] flagCode = new String[] { "+81""+82""+86""+49""+44",
      "+91""+57""+65""+34""+45""+20""+30""+41""+46",
      "+84" };

  //国名
  String[] flagNames = new String[] { "日本""韓国""中国""ドイツ""イギリス""インド",
      "コロンビア""シンガポール""スペイン""デンマーク""エジプト""ギリシャ""スイス",
      "スウェーデン""ベトナム" };

  //国旗のリソース
  int[] nationlFlag = { R.drawable.japan, R.drawable.korea,
      R.drawable.china, R.drawable.germany, R.drawable.uk,
      R.drawable.india, R.drawable.colombia, R.drawable.singapore,
      R.drawable.spain, R.drawable.denmark, R.drawable.egypt,
      R.drawable.greece, R.drawable.swiss, R.drawable.swedish,
      R.drawable.vietnam
  };


  //アダプタの要素情報を保持するクラス
  class NationlFlag {
    private Bitmap image;
    private String code;
    private String name;

    public NationlFlag(Bitmap image, String code, String name) {
      this.image = image;
      this.code = code;
      this.name = name;

    }

    public Bitmap getImage() {
      return image;
    }

    public String getCode() {
      return code;
    }

    public String getName() {
      return name;
    }
  }


  //毎回viewをinflateせず、再利用する為のクラス
  private static class ViewHolder {
    ImageView image;
    TextView tvCode;
    TextView tvName;

  }


  class ListFlagAdapter extends BaseAdapter {
    private Context context;
    private List<NationlFlag> list;

    public ListFlagAdapter(Context context) {
      super();
      this.context = context;
      list = new ArrayList<ListViewEx11.NationlFlag>();

      for (int i = 0; i < flagNames.length; i++) {
        Bitmap bmp = BitmapFactory.decodeResource(
            context.getResources(), nationlFlag[i]);
        list.add(new NationlFlag(bmp, flagCode[i], flagNames[i]));
      }
    }


    //数の取得
    @Override
    public int getCount() {
      return list.size();
    }

    //要素の取得
    @Override
    public Object getItem(int position) {
      return list.get(position);
    }

    //要素のID取得
    @Override
    public long getItemId(int position) {
      return position;
    }


    //Viewの生成
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

      NationlFlag nFlag = (NationlFlag) getItem(position);
      ViewHolder holder;

      //Viewオブジェクトが生成されていない場合
      if (convertView == null) {

        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.list_row, null);

        holder = new ViewHolder();
        holder.image = (ImageView) convertView
            .findViewById(R.id.flag_image);
        holder.tvCode = (TextView) convertView
            .findViewById(R.id.flag_code);
        holder.tvName = (TextView) convertView
            .findViewById(R.id.flag_name);

        convertView.setTag(holder);

      //すでにViewオブジェクトが生成されている場合
      } else {
        holder = (ViewHolder) convertView.getTag();
      }

      holder.image.setImageBitmap(nFlag.getImage());
      holder.tvCode.setText(nFlag.getCode());
      holder.tvName.setText(nFlag.getName());

      return convertView;
    }
  }


  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    ListView listView = (ListView) findViewById(R.id.lsit_view);
    listView.setAdapter(new ListFlagAdapter(this));

  }
}