Androidのアプリを作っていて、単純な「キー=値」構造のプルダウンメニューを一つ作ろうとすると、その都度 XXXAdapter extends ArrayAdapter<String> を作るハメになります。
毎回面倒ですので、どんなオブジェクトでも簡単にSpinner化できるようなKeyValueAdapterクラス+KeyValueItemインターフェースを作りました。
HTMLの<select>タグのような感じで使えますよ。
■サンプル:MyObjectクラス
package com.lumiere_couleur.android;
public class MyObject implements KeyValueItem {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public long getOptionValue() {
return id;
}
@Override
public String getOptionLabel() {
return name;
}
}
■KeyValueItemインターフェース
package com.lumiere_couleur.android;
public interface KeyValueItem {
// 選択肢の値
public long getOptionValue();
// 選択肢の表示文字列
public String getOptionLabel();
}
■KeyValueAdapterクラス
package com.lumiere_couleur.android;
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class KeyValueAdapter extends ArrayAdapter<String> {
private List<? extends KeyValueItem> items;
/**
* コンストラクタ
*
* @param context
* @param resourceId
* @param items
*/
public KeyValueAdapter(Context context, int resourceId,
List<? extends KeyValueItem> items) {
super(context, resourceId);
this.context = context;
this.items = items;
}
public int getCount() {
return items.size();
}
public String getItem(int position) {
return items.get(position).getOptionLabel();
}
public long getItemId(int position) {
return items.get(position).getOptionValue();
}
public int getPosition(long itemId) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getOptionValue() == itemId) {
return i;
}
}
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView label = new TextView(context);
label.setTextColor(Color.BLACK);
label.setText(items.get(position).getOptionLabel());
return label;
}
}
これでアダプターの量産から逃れられます。
情報共有ありがとうございます。
adapterのcontext変数は消えたみたいから、コンストラクタの中に下記コードを追加しなければなりません。
context=this.context;
(private Context context;)
@カニュ・ジョアンさん
ご指摘の通りでした!
どうもありがとうございます。コードを修正しました。
すいません!↓
this.context=context;
あ・・・本当だ(笑)
気が付きませんでした~