Android -ListView(BaseAdapter)-
ListView(BaseAdapter)
BaseAdapterクラスを継承したクラスには、ArrayAdapter・CursorAdapter・SimpleAdapterクラスがあります。
BaseAdapterクラスを拡張し、独自のAdapterクラスを定義、getViewメソッドをオーバーライドすることで、リスト項目の レイアウトを自由にカスタマイズすることができます。
ポイントは、getViewでリスト項目を1列表示する度に、毎回新しいウィジェットを作成せず、初回に作成した後は、再利用します。
getView の 最適化の参考サイト:Y.A.M の 雑記帳
ListView(BaseAdapter)サンプル
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));
}
}