Android

AndroidのSpinner用Key-Value簡易アダプター

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;
    }
}

これでアダプターの量産から逃れられます。

4 comments

  1. カニュ・ジョアン

    情報共有ありがとうございます。

    adapterのcontext変数は消えたみたいから、コンストラクタの中に下記コードを追加しなければなりません。
    context=this.context;

    (private Context context;)

  2. smilkobuta Post author

    @カニュ・ジョアンさん

    ご指摘の通りでした!
    どうもありがとうございます。コードを修正しました。

コメントを残す

メールアドレスが公開されることはありません。

Comments links could be nofollow free.