web-dev-qa-db-fra.com

Comment définir l'élément sélectionné de Spinner par valeur, pas 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 ceci, mais la variable Adapter n'a pas de méthode indexOf, je suis donc bloquée.

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

Supposons que votre Spinner s'appelle mSpinner et qu'il contienne comme choix: "une valeur".

Pour trouver et comparer la position de "certaine valeur" dans 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);
}
579
Merrill

Un moyen simple de définir spinner en fonction de 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;
 } 

Beaucoup de code complexe sont déjà là, ceci est juste beaucoup plus clair. 

122
Akhil Jain

Je garde une liste de tableaux séparée de tous les éléments de mes filtres. De cette façon, je peux faire indexOf sur ArrayList puis utiliser cette valeur pour définir la sélection dans le compteur.

34
Mark B

Sur la base de la réponse de Merrill , j'ai proposé cette solution monoligne ... ce n'est pas très joli, mais vous pouvez reprocher à quiconque maintient le code pour Spinner de négliger d'inclure une fonction qui le fait pour cela.

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

Vous recevrez un avertissement sur la façon dont la conversion vers ArrayAdapter<String> est décochée ... en réalité, vous pouvez simplement utiliser un ArrayAdapter comme Merrill l'a fait, mais cela ne fait qu'échanger un avertissement contre un autre.

27
ArtOfWarfare

si vous utilisez un tableau de chaînes, c’est le meilleur moyen: 

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

Vous pouvez utiliser cela aussi,

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

Si vous avez besoin d'une méthode indexOf sur un ancien adaptateur (et que vous ne connaissez pas l'implémentation sous-jacente), 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
xbakesx

D'après la réponse de Merrillil y a 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
max4ever

Utilisez la ligne suivante pour sélectionner en utilisant valeur:

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

Ceci 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
aLIEz

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
Miral Sarwar

Voici comment procéder si vous utilisez une SimpleCursorAdapter (où columnName est le nom de la colonne de base de données que vous avez utilisée pour renseigner 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 aurez-vous aussi besoin de fermer le curseur, selon que vous utilisiez un chargeur ou non.)

Aussi (un raffinement de la réponse d'Akhil ) c'est la manière 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
ban-geoengineering

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

J'espère que cette aide!

1
Scott.N

Si vous définissez un tableau XML sur spinner dans la présentation XML, vous pouvez le faire.

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

Comme certaines des réponses précédentes sont très justes, je veux juste m'assurer que personne ne tombe dans un tel problème.

Si vous définissez les valeurs sur ArrayList avec String.format, vous DEVEZ obtenir la position de la valeur en utilisant la même structure de chaîne 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 valeur requise comme ceci:

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

Sinon, vous obtiendrez le -1, élément non trouvé!

J'ai utilisé Locale.getDefault() à cause de langue arabe .

J'espère que cela vous sera utile.

0
Mohammad AlBanna

J'ai eu le même problème en essayant de sélectionner le bon élément dans un compteur rempli avec un cursorLoader. J'ai récupéré l'id de l'élément que je voulais d'abord sélectionner dans le tableau 1, puis utilisé un CursorLoader pour remplir le compteur. Dans onLoadFinished, j'ai parcouru le curseur en remplissant l'adaptateur du spinner jusqu'à ce que je trouve l'élément qui correspond à l'identifiant que j'avais déjà. Puis assigné le numéro de ligne du curseur à la position sélectionnée du compteur. Il serait bien d’avoir une fonction similaire pour transmettre l’id de la valeur que vous souhaitez sélectionner dans le compteur lors du remplissage des détails d’un formulaire contenant des résultats enregistrés. 

@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

Voici ma solution complète, espérons-le. J'ai l'énumération suivante:

public enum HTTPMethod {GET, HEAD}

utilisé en 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 fourni par Android-studio.

0
termigrator

Supposons que vous deviez remplir le curseur du tableau de chaînes de la ressource et que vous souhaitiez conserver la valeur du serveur sélectionnée .. C'est donc une façon de définir une valeur de serveur sélectionnée dans le compteur.

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

J'espère que ça aide! P.S. le code est en Kotlin!

0
hetsgandhi

Vous pouvez utiliser cette méthode, il suffit de rendre votre code plus simple et plus clair.

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

J'espère que ça aide.

0
azwar_akbar

Il existe en fait un moyen d'obtenir cela en utilisant une recherche d'index sur le AdapterArray et tout cela peut être fait avec une réflexion. Je suis même allé plus loin, car j'avais 10 Spinners et je voulais les définir de manière dynamique à partir de ma base de données. La base de données ne contient que la valeur, pas le texte, car Spinner change de semaine en semaine.

 // 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 toutes les listes, à condition que les champs se trouvent 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
}

La méthode cast qui peut être créée pour toutes les primitives en est une pour string 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
JPM

Comme j'avais besoin de quelque chose qui fonctionne aussi avec Localisation , je suis arrivé à ces deux méthodes:

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

Comme vous pouvez le constater, je suis également tombé sur une complexité supplémentaire de case sensitive entre arrays.xml et le value que je compare. Si vous ne l'avez pas, la méthode ci-dessus peut être simplifiée à quelque chose comme:

return arrayValues.indexOf(value);

Méthode d'assistance statique

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

très simple, utilisez simplement 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 

ci-dessus, le R.array.admin_type est un fichier de ressources sous forme de chaîne dans les valeurs 

il suffit de créer un fichier .xml dans values ​​>>.

0
pc expert

Pour que l'application retienne les dernières valeurs de rotation sélectionnées, vous pouvez utiliser le code ci-dessous:

  1. Le code ci-dessous lit la valeur de rotation et définit la position de rotation 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 si besoin est ... 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
user3339073