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);
}
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);
}
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.
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.
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.
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);
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;
}
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;
}
}
Vous pouvez l'utiliser aussi,
String[] baths = getResources().getStringArray(R.array.array_baths);
mSpnBaths.setSelection(Arrays.asList(baths).indexOf(value_here));
utilisez la ligne suivante pour sélectionner l'utilisation de la valeur:
mSpinner.setSelection(yourList.indexOf("value"));
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;
}
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));
}
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
}
};
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!
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<Device> needs to be passed as a List<Object> or Object[ ] by using
* Arrays.asList(device.toArray( )).
*
* @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;
}
pour que l'application se souvienne des dernières valeurs spinner sélectionnées, vous pouvez utiliser le code ci-dessous:
-
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; }
-
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();
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
}
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.
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);
où 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.
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);
}
}
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
vous devez passer votre adaptateur personnalisé avec la position comme répéter[position]. et il fonctionne correctement.