it-swarm.com.de

Wie kann ich den ausgewählten Spinner nach Wert und nicht nach Position setzen?

Ich habe eine Aktualisierungsansicht, in der ich den in der Datenbank gespeicherten Wert für einen Spinner vorwählen muss.

Ich hatte so etwas im Sinn, aber die Adapter hat keine indexOf-Methode, also bin ich festgefahren.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}
257
Pentium10

Angenommen, Ihre Spinner heißt mSpinner und enthält als eine der Optionen: "irgendein Wert".

Um die Position von "irgendeinem Wert" im Spinner zu finden und zu vergleichen, verwenden Sie Folgendes:

String compareValue = "some value";
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.select_state, Android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
if (compareValue != null) {
    int spinnerPosition = adapter.getPosition(compareValue);
    mSpinner.setSelection(spinnerPosition);
}
579
Merrill

Eine einfache Möglichkeit, den Spinner basierend auf dem Wert festzulegen, ist

mySpinner.setSelection(getIndex(mySpinner, myValue));

 //private method of your class
 private int getIndex(Spinner spinner, String myString){
     for (int i=0;i<spinner.getCount();i++){
         if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(myString)){
             return i;
         }
     }

     return 0;
 } 

Weg zu komplexem Code gibt es bereits, das ist einfach viel einfacher. 

122
Akhil Jain

Ich führe eine separate ArrayListe aller Elemente in meinen Spinners. Auf diese Weise kann ich indexOf für die ArrayList ausführen und dann diesen Wert verwenden, um die Auswahl im Spinner festzulegen.

34
Mark B

Basierend auf Merrills Antwort habe ich mir diese einzeilige Lösung ausgedacht ... es ist nicht sehr hübsch, aber Sie können denjenigen, der den Code für Spinner verwaltet, dafür verantwortlich machen, dass er es versäumt, eine Funktion zu verwenden, die dies tut.

mySpinner.setSelection(((ArrayAdapter<String>)mySpinner.getAdapter()).getPosition(myString));

Sie erhalten eine Warnung darüber, wie die Umwandlung in einen ArrayAdapter<String> nicht überprüft wird ... Sie könnten zwar eine ArrayAdapter wie Merrill verwenden, aber das tauscht nur eine Warnung gegen eine andere aus.

27
ArtOfWarfare

wenn Sie ein String-Array verwenden, ist dies der beste Weg: 

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);
9
itzhar

Sie können dies auch verwenden,

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
8
PrvN

Wenn Sie eine indexOf-Methode für einen alten Adapter benötigen (und die zugrunde liegende Implementierung nicht kennen), können Sie Folgendes verwenden:

private int indexOf(final Adapter adapter, Object value)
{
    for (int index = 0, count = adapter.getCount(); index < count; ++index)
    {
        if (adapter.getItem(index).equals(value))
        {
            return index;
        }
    }
    return -1;
}
8
xbakesx

Basierend auf der Antwort von Merrill wie man mit einem CursorAdapter vorgeht

CursorAdapter myAdapter = (CursorAdapter) spinner_listino.getAdapter(); //cast
    for(int i = 0; i < myAdapter.getCount(); i++)
    {
        if (myAdapter.getItemId(i) == ordine.getListino() )
        {
            this.spinner_listino.setSelection(i);
            break;
        }
    }
7
max4ever

Verwenden Sie die folgende Zeile, um den Wert auszuwählen:

mSpinner.setSelection(yourList.indexOf("value"));
5
Faisal Shaikh

Dies ist meine einfache Methode, um den Index als Zeichenfolge abzurufen.

private int getIndexByString(Spinner spinner, String string) {
    int index = 0;

    for (int i = 0; i < spinner.getCount(); i++) {
        if (spinner.getItemAtPosition(i).toString().equalsIgnoreCase(string)) {
            index = i;
            break;
        }
    }
    return index;
}
3
aLIEz

Ich verwende einen benutzerdefinierten Adapter, für den dieser Code ausreicht:

yourSpinner.setSelection(arrayAdapter.getPosition("Your Desired Text"));

Ihr Code-Snippet sieht also so aus:

void setSpinner(String value)
    {
         yourSpinner.setSelection(arrayAdapter.getPosition(value));
    }
2
Miral Sarwar

Gehen Sie wie folgt vor, wenn Sie eine SimpleCursorAdapter verwenden (wobei columnName der Name der Datenbankspalte ist, die Sie zum Auffüllen Ihrer spinner verwendet haben):

private int getIndex(Spinner spinner, String columnName, String searchString) {

    //Log.d(LOG_TAG, "getIndex(" + searchString + ")");

    if (searchString == null || spinner.getCount() == 0) {
        return -1; // Not found
    }
    else {

        Cursor cursor = (Cursor)spinner.getItemAtPosition(0);

        for (int i = 0; i < spinner.getCount(); i++) {

            cursor.moveToPosition(i);
            String itemText = cursor.getString(cursor.getColumnIndex(columnName));

            if (itemText.equals(searchString)) {
                return i;
            }
        }
        return -1; // Not found
    }
}

(Vielleicht müssen Sie auch den Cursor schließen, je nachdem, ob Sie einen Loader verwenden.)

Auch (eine Verfeinerung von Akhils Antwort ) ist dies die entsprechende Methode, wenn Sie Ihren Spinner aus einem Array füllen:

private int getIndex(Spinner spinner, String searchString) {

    if (searchString == null || spinner.getCount() == 0) {

        return -1; // Not found

    }
    else {

        for (int i = 0; i < spinner.getCount(); i++) {
            if (spinner.getItemAtPosition(i).toString().equals(searchString)) {
                return i; // Found!
            }
        }

        return -1; // Not found
    }
};
2

hier ist meine Lösung

List<Country> list = CountryBO.GetCountries(0);
CountriesAdapter dataAdapter = new CountriesAdapter(this,list);
dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spnCountries.setAdapter(dataAdapter);
spnCountries.setSelection(dataAdapter.getItemIndexById(userProfile.GetCountryId()));

und getItemIndexById weiter unten

public int getItemIndexById(String id) {
    for (Country item : this.items) {
        if(item.GetId().toString().equals(id.toString())){
            return this.items.indexOf(item);
        }
    }
    return 0;
}

Ich hoffe das hilft!

1
Scott.N

Wenn Sie im XML-Layout ein XML-Array auf den Spinner setzen, können Sie dies tun

final Spinner hr = v.findViewById(R.id.chr);
final String[] hrs = getResources().getStringArray(R.array.hours);
if(myvalue!=null){
   for (int x = 0;x< hrs.length;x++){
      if(myvalue.equals(hrs[x])){
         hr.setSelection(x);
      }
   }
}
1
Lasitha Lakmal
YourAdapter yourAdapter =
            new YourAdapter (getActivity(),
                    R.layout.list_view_item,arrData);

    yourAdapter .setDropDownViewResource(R.layout.list_view_item);
    mySpinner.setAdapter(yourAdapter );


    String strCompare = "Indonesia";

    for (int i = 0; i < arrData.length ; i++){
        if(arrData[i].getCode().equalsIgnoreCase(strCompare)){
                int spinnerPosition = yourAdapter.getPosition(arrData[i]);
                mySpinner.setSelection(spinnerPosition);
        }
    }
0
user2063903

Da einige der vorangegangenen Antworten sehr richtig sind, möchte ich nur sicherstellen, dass keiner von Ihnen in dieses Problem fällt.

Wenn Sie die Werte mit String.format auf die Variable ArrayList setzen, MÜSSEN Sie die Position des Werts mit derselben String-Struktur String.format ermitteln.

Ein Beispiel:

ArrayList<String> myList = new ArrayList<>();
myList.add(String.format(Locale.getDefault() ,"%d", 30));
myList.add(String.format(Locale.getDefault(), "%d", 50));
myList.add(String.format(Locale.getDefault(), "%d", 70));
myList.add(String.format(Locale.getDefault(), "%d", 100));

Sie müssen die Position des benötigten Werts wie folgt ermitteln:

myList.setSelection(myAdapter.getPosition(String.format(Locale.getDefault(), "%d", 70)));

Andernfalls erhalten Sie den -1, Artikel nicht gefunden!

Ich habe Locale.getDefault() wegen arabischer Sprache verwendet.

Ich hoffe das wird für Sie hilfreich sein.

0

Ich hatte das gleiche Problem, als ich versuchte, das richtige Element in einem mit einem CursorLoader bestückten Spinner auszuwählen. Ich habe die ID des Elements abgerufen, das ich zuerst aus Tabelle 1 auswählen wollte, und dann einen CursorLoader verwendet, um den Spinner aufzufüllen. Im onLoadFinished bin ich durch den Cursor gefahren, der den Adapter des Spinners bevölkert, bis ich den Artikel gefunden habe, der mit der ID übereinstimmt, die ich bereits hatte. Dann ordnet die Zeilennummer des Cursors der ausgewählten Position des Spinners zu. Es wäre schön, wenn Sie eine ähnliche Funktion haben, um die ID des Werts zu übergeben, den Sie im Spinner auswählen möchten, wenn Sie Details in ein Formular mit gespeicherten Spinnerergebnissen füllen. 

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
  adapter.swapCursor(cursor);

  cursor.moveToFirst();

 int row_count = 0;

 int spinner_row = 0;

  while (spinner_row < 0 || row_count < cursor.getCount()){ // loop until end of cursor or the 
                                                             // ID is found 

    int cursorItemID = bCursor.getInt(cursor.getColumnIndexOrThrow(someTable.COLUMN_ID));

    if (knownID==cursorItemID){
    spinner_row  = row_count;  //set the spinner row value to the same value as the cursor row 

    }
cursor.moveToNext();

row_count++;

  }

}

spinner.setSelection(spinner_row ); //set the selected item in the spinner

}
0
Jaz

Hier ist meine hoffentlich vollständige Lösung. Ich habe folgende enum:

public enum HTTPMethod {GET, HEAD}

wird in folgender Klasse verwendet

public class WebAddressRecord {
...
public HTTPMethod AccessMethod = HTTPMethod.HEAD;
...

Code zum Festlegen des Spinners von HTTPMethod enum-member:

    Spinner mySpinner = (Spinner) findViewById(R.id.spinnerHttpmethod);
    ArrayAdapter<HTTPMethod> adapter = new ArrayAdapter<HTTPMethod>(this, Android.R.layout.simple_spinner_item, HTTPMethod.values());
    mySpinner.setAdapter(adapter);
    int selectionPosition= adapter.getPosition(webAddressRecord.AccessMethod);
    mySpinner.setSelection(selectionPosition);

Dabei ist R.id.spinnerHttpmethod in einer Layoutdatei definiert und Android.R.layout.simple_spinner_item wird von Android-Studio geliefert.

0
termigrator

Angenommen, Sie müssen den Spinner aus dem String-Array aus der Ressource ausfüllen, und Sie möchten den Wert von server .. auswählen.

pincodeSpinner.setSelection(resources.getStringArray(R.array.pincodes).indexOf(javaObject.pincode))

Hoffe es hilft! P.S. Der Code ist in Kotlin!

0
hetsgandhi

Auf diese Weise können Sie Ihren Code einfacher und klarer gestalten.

ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinnerCountry.getAdapter();
int position = adapter.getPosition(obj.getCountry());
spinnerCountry.setSelection(position);

Ich hoffe es hilft.

0
azwar_akbar

Es gibt tatsächlich eine Möglichkeit, dies mithilfe einer Indexsuche auf dem AdapterArray zu erhalten, und all dies kann mit Reflektion ausgeführt werden. Ich ging sogar noch einen Schritt weiter, da ich 10 Spinner hatte und sie dynamisch aus meiner Datenbank setzen wollte. Die Datenbank enthält nur den Wert, nicht den Text, da sich der Spinner tatsächlich von Woche zu Woche ändert.

 // Get the JSON object from db that was saved, 10 spinner values already selected by user
 JSONObject json = new JSONObject(string);
 JSONArray jsonArray = json.getJSONArray("answer");

 // get the current class that Spinner is called in 
 Class<? extends MyActivity> cls = this.getClass();

 // loop through all 10 spinners and set the values with reflection             
 for (int j=1; j< 11; j++) {
      JSONObject obj = jsonArray.getJSONObject(j-1);
      String movieid = obj.getString("id");

      // spinners variable names are s1,s2,s3...
      Field field = cls.getDeclaredField("s"+ j);

      // find the actual position of value in the list     
      int datapos = indexedExactSearch(Arrays.asList(Arrays.asList(this.data).toArray()), "value", movieid) ;
      // find the position in the array adapter
      int pos = this.adapter.getPosition(this.data[datapos]);

      // the position in the array adapter
      ((Spinner)field.get(this)).setSelection(pos);

}

Hier ist die indizierte Suche, die Sie für fast jede Liste verwenden können, solange sich die Felder auf der obersten Objektebene befinden.

    /**
 * Searches for exact match of the specified class field (key) value within the specified list.
 * This uses a sequential search through each object in the list until a match is found or end
 * of the list reached.  It may be necessary to convert a list of specific objects into generics,
 * ie: LinkedList&ltDevice&gt needs to be passed as a List&ltObject&gt or Object[&nbsp] by using 
 * Arrays.asList(device.toArray(&nbsp)).
 * 
 * @param list - list of objects to search through
 * @param key - the class field containing the value
 * @param value - the value to search for
 * @return index of the list object with an exact match (-1 if not found)
 */
public static <T> int indexedExactSearch(List<Object> list, String key, String value) {
    int low = 0;
    int high = list.size()-1;
    int index = low;
    String val = "";

    while (index <= high) {
        try {
            //Field[] c = list.get(index).getClass().getDeclaredFields();
            val = cast(list.get(index).getClass().getDeclaredField(key).get(list.get(index)) , "NONE");
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        if (val.equalsIgnoreCase(value))
            return index; // key found

        index = index + 1;
    }

    return -(low + 1);  // key not found return -1
}

Die Cast-Methode, die für alle Grundelemente erstellt werden kann, ist eine für string und int.

        /**
 *  Base String cast, return the value or default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type String
 */
public static String cast(Object object, String defaultValue) {
    return (object!=null) ? object.toString() : defaultValue;
}


    /**
 *  Base integer cast, return the value or default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type integer
 */
public static int cast(Object object, int defaultValue) { 
    return castImpl(object, defaultValue).intValue();
}

    /**
 *  Base cast, return either the value or the default
 * @param object - generic Object
 * @param defaultValue - default value to give if Object is null
 * @return - returns type Object
 */
public static Object castImpl(Object object, Object defaultValue) {
    return object!=null ? object : defaultValue;
}
0
JPM

Da ich etwas brauchte, das auch mit Lokalisierung funktioniert, habe ich mir diese beiden Methoden ausgedacht:

    private int getArrayPositionForValue(final int arrayResId, final String value) {
        final Resources english = Utils.getLocalizedResources(this, new Locale("en"));
        final List<String> arrayValues = Arrays.asList(english.getStringArray(arrayResId));

        for (int position = 0; position < arrayValues.size(); position++) {
            if (arrayValues.get(position).equalsIgnoreCase(value)) {
                return position;
            }
        }
        Log.w(TAG, "getArrayPosition() --> return 0 (fallback); No index found for value = " + value);
        return 0;
    }

Wie Sie sehen können, bin ich auch über die zusätzliche Komplexität von GroßKleinschreibung -/zwischen arrays.xml und der value gestolpert, mit der ich vergleiche. Wenn Sie dies nicht haben, kann die obige Methode zu etwas vereinfacht werden:

return arrayValues.indexOf(value);

Statische Hilfsmethode

public static Resources getLocalizedResources(Context context, Locale desiredLocale) {
        Configuration conf = context.getResources().getConfiguration();
        conf = new Configuration(conf);
        conf.setLocale(desiredLocale);
        Context localizedContext = context.createConfigurationContext(conf);
        return localizedContext.getResources();
    }
0
AZOM

sehr einfach, verwenden Sie einfach getSelectedItem();

z.B :

ArrayAdapter<CharSequence> type=ArrayAdapter.createFromResource(this,R.array.admin_typee,Android.R.layout.simple_spinner_dropdown_item);
        type.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
        mainType.setAdapter(type);

String group=mainType.getSelectedItem().toString();

die obige Methode gibt einen String-Wert zurück 

in der obigen Tabelle ist R.array.admin_type eine String-Ressourcendatei in Werten 

erstellen Sie einfach eine .xml-Datei in Werte >> Zeichenfolgen

0
pc expert

Damit sich die Anwendung die zuletzt ausgewählten Spinnerwerte merken kann, können Sie folgenden Code verwenden:

  1. Der folgende Code liest den Spinnerwert und stellt die Spinnerposition entsprechend ein. 

    public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    int spinnerPosition;
    
    Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.ccy_array,
            Android.R.layout.simple_spinner_dropdown_item);
    adapter1.setDropDownViewResource(Android.R.layout.simple_list_item_activated_1);
    // Apply the adapter to the spinner
    spinner1.setAdapter(adapter1);
    // changes to remember last spinner position
    spinnerPosition = 0;
    String strpos1 = prfs.getString("SPINNER1_VALUE", "");
    if (strpos1 != null || !strpos1.equals(null) || !strpos1.equals("")) {
        strpos1 = prfs.getString("SPINNER1_VALUE", "");
        spinnerPosition = adapter1.getPosition(strpos1);
        spinner1.setSelection(spinnerPosition);
        spinnerPosition = 0;
    }
    
  2. Fügen Sie den Code unter dem Code ein, an dem Sie wissen, dass die neuesten Spinnerwerte vorhanden sind, oder an einem anderen Ort nach Bedarf. Dieser Code schreibt den Spinnerwert grundsätzlich in SharedPreferences.

        Spinner spinner1 = (Spinner) findViewById(R.id.spinner1);
        String spinlong1 = spinner1.getSelectedItem().toString();
        SharedPreferences prfs = getSharedPreferences("WHATEVER",
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prfs.edit();
        editor.putString("SPINNER1_VALUE", spinlong1);
        editor.commit();
    
0
user3339073