Comment définir L'article sélectionné de Spinner par valeur, et non par position?

j'ai une vue de mise à jour, où je dois présélectionner la valeur stockée dans la base de données pour un Spinner.

je pensais à quelque chose comme ça, mais le Adapter n'a pas de méthode indexOf , donc je suis coincé.

void setSpinner(String value)
{
    int pos = getSpinnerField().getAdapter().indexOf(value);
    getSpinnerField().setSelection(pos);
}
238
demandé sur thyago stall 2010-03-06 00:36:40

21 réponses

supposons que votre Spinner s'appelle mSpinner , et qu'il contient comme un de ses choix:"une certaine valeur".

pour trouver et comparer la position de" une certaine valeur "dans le Spinner utilisez ceci:

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);
}
557
répondu Merrill 2018-01-04 12:43:46

une façon simple de définir spinner basé sur la valeur est

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

façon de code complexe sont déjà là, c'est juste beaucoup plus simple.

113
répondu Akhil Jain 2018-04-17 10:10:26

je tiens une liste séparée de tous les articles dans mes broches. De cette façon, je peux faire indexOf sur la liste ArrayList et ensuite utiliser cette valeur pour définir la sélection dans le Spinner.

34
répondu Mark B 2010-03-05 21:44:35

basé sur la réponse de Merrill , j'ai trouvé cette solution de ligne unique... ce n'est pas très joli, mais vous pouvez blâmer quiconque maintient le code pour Spinner d'avoir négligé d'inclure une fonction qui fait cela pour cela.

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

vous recevrez un avertissement sur la façon dont le plâtre d'un ArrayAdapter<String> est non vérifié... vraiment, vous pourriez juste utiliser un ArrayAdapter comme Merrill L'a fait, mais qui échange Juste un avertissement pour un autre.

27
répondu ArtOfWarfare 2017-05-23 10:31:39

si vous utilisez le tableau de chaînes de caractères, c'est la meilleure façon:

int selectionPosition= adapter.getPosition("YOUR_VALUE");
spinner.setSelection(selectionPosition);
9
répondu itzhar 2015-03-19 21:05:28

si vous avez besoin d'avoir un index de méthode sur n'importe quel Vieux adaptateur (et vous ne connaissez pas l'implémentation sous-jacente) alors vous pouvez utiliser ceci:

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
répondu xbakesx 2012-08-29 22:26:45

D'après la réponse de Merrill voici comment faire avec un CursorAdapter

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
répondu max4ever 2012-07-26 10:07:56

Vous pouvez l'utiliser aussi,

String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
7
répondu PrvN 2013-10-17 10:44:44

utilisez la ligne suivante pour sélectionner l'utilisation de la valeur:

mSpinner.setSelection(yourList.indexOf("value"));
5
répondu Faisal Shaikh 2016-12-18 19:28:25

c'est ma méthode simple pour obtenir l'index par chaîne.

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
répondu aLIEz 2016-10-19 03:15:37

j'utilise un adaptateur personnalisé, pour que ce code soit suffisant:

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

ainsi, votre extrait de code sera comme ceci:

void setSpinner(String value)
    {
         yourSpinner.setSelection(arrayAdapter.getPosition(value));
    }
2
répondu Miral Sarwar 2015-06-10 09:03:01

Voici comment le faire si vous utilisez un SimpleCursorAdapter (où columnName est le nom de la colonne db que vous avez utilisé pour peupler votre spinner ):

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

(peut-être que vous devrez aussi fermer le curseur, selon que vous utilisez un chargeur.)

aussi (un raffinement de réponse D'Akhil ) c'est la façon correspondante de le faire si vous remplissez votre Spinner à partir d'un tableau:

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
répondu ban-geoengineering 2017-05-23 12:10:47

voici ma solution

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

et getItemIndexById ci-dessous

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

Espérons que cette aide!

1
répondu Scott.N 2012-07-05 04:21:56

il y a en fait un moyen d'obtenir ceci en utilisant une recherche d'index sur L'AdapterArray et tout cela peut être fait avec réflexion. J'ai même fait un pas de plus car j'avais 10 Spinners et je voulais les définir dynamiquement à partir de ma base de données et la base de données contient la valeur seulement pas le texte car le Spinner change réellement semaine en semaine donc la valeur est mon numéro d'id de la base de données.

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

}

Voici la recherche indexée que vous pouvez utiliser sur presque n'importe quelle liste aussi longtemps que le les champs sont au niveau supérieur de l'objet.

    /**
 * 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
}

méthode Cast qui peut être créé pour toutes les primitives ici est un pour la chaîne et 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
répondu JPM 2011-05-13 02:42:35

pour que l'application se souvienne des dernières valeurs spinner sélectionnées, vous pouvez utiliser le code ci-dessous:

  1. ci-dessous le code lit la valeur de spinner et définit la position de spinner en conséquence.

    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. et mettez ci-dessous le code où vous savez que les dernières valeurs de spinner sont présentes, ou ailleurs selon les besoins. Ce morceau de code écrit essentiellement la valeur de spinner dans 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
répondu user3339073 2014-07-31 13:00:51

j'ai eu le même problème en essayant de sélectionner le bon élément dans un spinner peuplé en utilisant un curseur loader. J'ai récupéré l'id de l'élément que je voulais sélectionner d'abord à partir du tableau 1 et j'ai ensuite utilisé un curseur pour remplir la broche. Dans l'onLoadFinished j'ai traversé le curseur peuplant l'adaptateur de la broche jusqu'à ce que je trouve l'article qui correspondait à l'id que j'avais déjà. Ensuite, assignez le numéro de ligne du curseur à la position choisie par le spinner. Il serait agréable d'avoir un similaire fonction pour transmettre l'id de la valeur que vous souhaitez sélectionner dans la casserole lors du remplissage d'informations sur un formulaire contenant enregistré spinner résultats.

@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
répondu Jaz 2014-09-22 12:23:42

comme certaines des réponses précédentes sont très bonnes, je veux juste m'assurer qu'aucun de vous ne tombe dans un tel problème.

si vous définissez les valeurs à ArrayList en utilisant String.format , vous devez obtenir la position de la valeur en utilisant la même structure de chaîne de caractères String.format .

un exemple:

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

vous devez obtenir la position de la valeur nécessaire comme ceci:

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

sinon, vous obtiendrez le -1 , article introuvable!

j'ai utilisé Locale.getDefault() en raison de langue arabe .

j'espère que cela vous sera utile.

0
répondu Mohammad 2016-05-16 15:38:10

voici ma solution complète. J'ai l'enum suivant:

public enum HTTPMethod {GET, HEAD}

utilisé dans la classe suivante

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

code pour définir le spinner par 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);

R.id.spinnerHttpmethod est défini dans un fichier de mise en page, et android.R.layout.simple_spinner_item est livré par android-studio.

0
répondu termigrator 2016-12-26 13:29:57
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
répondu user2063903 2018-02-12 03:45:28

utilisation très simple getSelectedItem();

par exemple :

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

la méthode ci-dessus renvoie une valeur de chaîne de caractères

dans ce qui précède le R.array.admin_type est un fichier de ressources de chaîne de caractères dans les valeurs

il suffit de créer un .fichier xml en valeurs > > chaînes de caractères

0
répondu pc expert 2018-06-28 17:38:39

vous devez passer votre adaptateur personnalisé avec la position comme répéter[position]. et il fonctionne correctement.

-3
répondu Urvi Jasani 2015-03-18 02:27:24