Android Spinner mit verschiedenen Layouts für „Drop-Down-Zustand“ und „geschlossenen Zustand“?

StackOverflow https://stackoverflow.com/questions/4647299

Frage

ich einen Android-Spinner Blick in meinem Layout. Ich würde diesen Spinner mögen nur ein einziges Textelement zu zeigen, wenn sie geschlossen ist, aber wenn der Benutzer klickt auf sie (dh öffnet den Spinner-Dialog) Ich möchte weitergehende Informationen für jedes Element zeigen, darunter ein Symbol und eine zusätzliche Beschreibung Textansicht . Wie es jetzt die Spinner zeigt das gleiche Layout ist (Symbol, Titel und Beschreibung) in beiden Staaten.

Wenn ich eine ArrayAdapter zum Spinner befestigen, dann erhalte ich Zugriff auf die so genannten „setDropDownViewResource“ aber das ist nicht unbedingt das, was ich brauche, da mein Spinner Datum von einem Cursor nicht aus einem Array von jeder Art abgerufen wird (ich habe, ab sofort, meinen eigenen Adapter, Erweiterung BaseAdapter).

Wer kann mir helfen?

War es hilfreich?

Lösung

Sie haben eine benutzerdefinierte erstellen Adapter Klasse für den Spinner und überschreiben die beiden Methoden getView() für die normale geschlossene Ansicht und getDropDownView() für die Dropdown-Listenansicht. Beide Verfahren müssen ein View Objekt für ein einzelnes Element zurück.

Hier finden Sie aktuelle dieses Tutorial es könnte Ihnen helfen, begonnen.

Andere Tipps

Ich habe auch Probleme. Anstatt die Klasse überschreiben, hava ich einen einfacheren Weg, dies zu tun.

Aber zuerst müssen Sie den Unterschied zwischen der Ressource-ID in dem Adapter Konstruktor, und der andere in setDropDownViewResource(...) verstehen. Zum Beispiel:

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 ist der Stil für Spinner , und R.layout.actionbar_list_item für jedes einzelnes Listenelement.

Ich habe SimpleAdapter hier, da, wenn ich ArrayAdapter verwenden, kann die xml nur eine einzige Textview sein.

R.layout.actionbar_list_item enthält eine Textview mit id = event_id und ein Imageview mit id = icon.

R.layout.actionbar_dropdown ist fast genau die gleiche wie actionbar_list_item, aber die Sichtbarkeit der Image des letzteren ist auf GONE .

Auf diese Weise jedes Listenelement hat eine Textview und einen Imageview, aber Sie werden nur eine Textview auf dem Spinner sehen.

Mit dem Code des von Flo verbunden Tutorial, habe ich den folgenden CustomSpinnerAdapter um zwei verschiedene Sätze von Saiten zu zeigen, ein, wenn die Elemente angezeigt werden, und ein, wenn nicht. Ich hoffe, es hilft jemand.

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

Und die Verwendung in einem Fragment :

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

Schließlich wird das Layout für den Spinner Artikel:

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" />

Nur setzt die Drop-Down-Ansicht Ressource mit alternativem Layout:

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

Für mich ist es nur ein Layout mit einer extra Polsterung links, weil mein Hintergrund des Spinners ein abgerundeter ziehbar ist und diesen zusätzlichen Platz benötigen.

Just call setUpSpinner() method after getting reference to spinner

// here is setUpSpinner method

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top