web-dev-qa-db-ja.com

Android「ドロップダウン状態」と「クローズ状態」のレイアウトが異なるスピナー?

レイアウトにAndroid Spinnerビューがあります。閉じたときにそのスピナーに1つのテキスト項目のみを表示したいのですが、ユーザーがクリックすると(スピナーダイアログを開く)アイコンや追加の説明テキストビューなど、各アイテムの詳細な情報を表示したいので、スピナーは両方の状態でまったく同じレイアウト(アイコン、タイトル+説明)を表示します。

ArrayAdapterをスピナーにアタッチすると、「setDropDownViewResource」と呼ばれるものにアクセスできますが、スピナーデータはあらゆる種類の配列からではなくカーソルから取得されるため、必ずしも必要ではありません(現在のところ、 、BaseAdapterを拡張する独自のアダプターを作成しました)。

助けてくれる人はいますか?

59
dbm

カスタム Adapter Spinnerのクラスを作成し、2つのメソッドを上書きする必要があります getView() 通常の閉じたビューの場合- getDropDownView() ドロップダウンリストビュー用。両方のメソッドは、単一の要素に対してViewオブジェクトを返す必要があります。

このチュートリアル をご覧ください。始めるのに役立つかもしれません。

104
Flo

私も問題を抱えていました。クラスをオーバーライドするのではなく、これを行う簡単な方法があります。

ただし、最初に、アダプターコンストラクターのリソースIDとsetDropDownViewResource(...)のリソースIDの違いを理解する必要があります。例えば、

SimpleAdapter adapter =
    new SimpleAdapter(ab.getThemedContext(), data, R.layout.actionbar_dropdown, new String[] { "EventID", "Icon" },
        new int[] { R.id.event_id, R.id.icon });

adapter.setDropDownViewResource(R.layout.actionbar_list_item);

R.layout.actionbar_dropdownは、spinnerのスタイルであり、すべてのリスト項目ごとにR.layout.actionbar_list_itemです。

ここでSimpleAdapterを使用しました。ArrayAdapterを使用する場合、xmlは単一のTextViewにしかなれないためです。

R.layout.actionbar_list_itemには、IDがevent_idのTextViewと、IDがiconのImageViewが含まれます。

R.layout.actionbar_dropdownactionbar_list_itemとほぼ同じですが、後者のImageViewの可視性は[〜#〜] gone [〜#〜]に設定されます。

この方法では、すべてのリスト項目にテキストビューとイメージビューがありますが、スピナーにはテキストビューしか表示されません。

14
AstraChen

Floによってリンクされたチュートリアルのコードを使用して、次のCustomSpinnerAdapterを作成し、2つの異なる文字列セットを表示します。1つはアイテムが表示され、もう1つは表示されません。私はそれが誰かを助けることを願っています。

public class CustomSpinnerAdapter extends ArrayAdapter<String> {

Context mContext;
int mTextViewResourceId;
String[] mObjects;
String[] mShortNameObjects;

public CustomSpinnerAdapter(Context context, int textViewResourceId,
                            String[] objects, String[] shortNameObjects) {
    super(context, textViewResourceId, objects);
    mContext = context;
    mTextViewResourceId = textViewResourceId;
    mObjects = objects;
    mShortNameObjects = shortNameObjects;
}

@Override
public View getDropDownView(int position, View convertView,
                            ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
    row.setText(mObjects[position]);

    return row;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return getCustomView(position, convertView, parent);
}

public View getCustomView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false);
    row.setText(mShortNameObjects[position]);

    return row;
}
}

そして、使用法フラグメント内

CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names));

最後に、スピナーアイテムのレイアウト:

spinner_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:textSize="18dip"
    Android:gravity="left"
    Android:textColor="@color/navdraw_list_item_background_default"
    Android:padding="5dip" />
10

代替レイアウトでドロップダウンビューリソースのみを設定します。

ArrayAdapter<String> genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER);
genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown);
view.setAdapter(genderAdapter);

私にとって、スピナーの背景は丸いドローアブルであり、この余分なスペースが必要なため、それは余分なパディングが残っているレイアウトのみです。

8
Joao Polo

スピナーへの参照を取得した後にsetUpSpinner()メソッドを呼び出すだけです

//ここにsetUpSpinnerメソッドがあります

private void setupSpinner() {

    // Create adapter for spinner. The list options are from the String array it will use
    // the spinner will use the default layout
    ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(this,
            R.array.array_dropdown_options, Android.R.layout.simple_spinner_item);

    // Specify dropdown layout style - simple list view with 1 item per line
    spinnerAdapter.setDropDownViewResource(Android.R.layout.simple_dropdown_item_1line);

    // Apply the adapter to the spinner
    spinner.setAdapter(spinnerAdapter);
   // spinner is referenced spinner by finViewById.

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String selection = (String) parent.getItemAtPosition(position);
            if (!TextUtils.isEmpty(selection)) {
                if (selection.equals(getString(R.string.item_a))) {
                    // your code for selected item whose id equals to id to R.string.item_a
                } else if (selection.equals(getString(R.string.item_b))) {
                    // your code
                } else {
                    // your code
                }
            }
        }

        // Because AdapterView is an abstract class, onNothingSelected must be defined
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            // code for nothing selected in dropdown
        }
    });
}
1
Chetan Pawar