web-dev-qa-db-fra.com

Android: setSelection n'ayant aucun effet sur Spinner

J'ai un problème avec setSelection sur Spinner. Je règle la valeur à présélectionner lorsque le compteur est affiché dans le code, mais cela n'a aucun effet et la première alternative de la liste est toujours sélectionnée. Le code ressemble à ceci: 

    LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View dialogView = li.inflate(R.layout.edit_event, null);
    ...
    ArrayList<String> routes = new ArrayList<String>();
    // routes filled with values at runtime
    ...
    ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, Android.R.layout.simple_spinner_item, routes);
    aa.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

    Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination);

    String dest = events.get(pos).getDestination();
    int routesPos = routes.indexOf(dest);
    Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
    destSpinner.setSelection(routesPos);

    destSpinner.setAdapter(aa);

Le code fonctionne comme prévu, à l'exception de la partie setSelection, et je ne peux tout simplement pas comprendre pourquoi.

La présentation XML de la visière ressemble à ceci (pas la disposition entière, mais seulement la partie visière):

// DESTINATION
<TextView
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:text="Destination:" />
<Spinner
   Android:id="@+id/edit_event_destination"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:Prompt="@string/choose_dest"
   Android:layout_marginBottom="10dip"
   Android:text="" />

L'aide est très appréciée!

Linus

46
aspartame

Essayez de déplacer l'appel vers setSelection() après l'appel à setAdapter().

108
CommonsWare

J'ai eu le même problème. Dans mon cas, setAdaper et setSelection étaient dans le bon ordre! La forme exécutée onCreate fonctionnait, mais lorsqu'elle était exécutée à partir de onResume, elle n'avait aucun effet. 

La solution est d'appeler setSelection(my_pos, true). Remarquez le deuxième paramètre.

65
Greg Dan

Vous pourriez essayer 

mSpinner.post(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  });

cela affichera l'action exécutable à exécuter dès que la vue est créée

29
user2532906

Dans mon cas, aucune des réponses n’a fonctionné, alors j’ai mis en file d'attente la setSelection via un gestionnaire

new Handler().postDelayed(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  }, 100);

Cela pourrait poser des problèmes lors de l'exécution sur des périphériques lents, mais je travaille pour un périphérique spécifique, il est donc correct d'utiliser ce hack

21
Maragues

utilisez ceci

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);
1
Ali Bagheri

Spinner.setSelection() ne fonctionne pas si vous appelez avant Spinner.setAdapter()

Essayez d’appeler setSelection() après l’appel de setAdapter ().

Reason Behind this : lorsque vous appelez Spinner.Selection() avant de définir un adaptateur, cela signifie simplement que vous essayez de définir spinner sur index personnalisé à l'aide de setSelection () lorsqu'il ne contient aucune donnée ou que nous pouvons dire que spinner a item = 0.

so setSelection(1) signifie la mise à 1 de l'index pour spinner qui a max item = 0; Bien que Spinner lui-même gère cette valeur outBoundIndex afin que votre application ne se bloque pas.

l'appel à SetSelection() devrait se faire après setAdapter () uniquement

De même, si vous avez un Spinner.SetOnItemSelectedListener() et que vous avez un problème, onItemSelected(AdapterView<?> parent, View view, int position, long id) est activé avec la valeur de position = 0 lorsque l'activité est chargée et vous devez utiliser ce modèle.

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();
1
saksham

La solution consiste à appeler setSelection (my_pos, true). Remarquez le deuxième paramètre.

N'oubliez pas que si vous appelez animate, configurez les paramètres de présentation, puis:) Exemple:

LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);

les rembourrages réglés manuellement sur la roulette doivent être réinitialisés manuellement 

1
Sergey Plahotnick

J'ai eu le même problème avec un spinner à l'intérieur d'un fragment : setSelection qui fonctionne correctement pendant la onCreate au premier démarrage de l'activité, mais pas lorsque je fais pivoter l'écran. Je l'ai résolu en appelant setSelection dans la méthode onViewStateRestored du fragment au lieu de l'appeler dans la méthode onCreate. Je ne suis pas sûr, mais je pense que vous ne pouvez pas utiliser setSelection tant que la vue n'est pas complètement chargée, même si vous pouvez findViewById le.

1
piiiiipppp

Aucune des réponses précédentes n'a fonctionné pour moi. Ce qui a bien fonctionné, cependant, a été de créer la variable d'instance mSpinner dans la méthode onCreateView() de mon fragment (ou dans la méthode onCreate() de votre activité), puis de le faire dans ma méthode onLoadFinished() ...

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}
1
ban-geoengineering

essayez ceci, cela a fonctionné pour moi:

Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination);
destSpinner.setSelection(0);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
destSpinner.setAdapter(aa);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);
0
skandhan

Parfois, il est possible que nous ne configurions pas les écouteurs, car le compteur peut être défini sur une certaine valeur et désactivé selon les besoins. 

Cela peut entraîner que setSelection () ne sélectionne pas de valeur, car elle nécessite un écouteur.

Assurez-vous que setOnItemSelectedListener () de Spinner est défini sur un écouteur personnalisé, comme ci-dessous.

Même si spinner est désactivé, nous devons définir un écouteur comme ci-dessous pour que la méthode setSelection () fonctionne.

spinnerListener.setOnItemSelectedListener(spinnerListener);
AdapterView.OnItemSelectedListener spinnerListener = new 
AdapterView.OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
      //Your code
    }
}
spinnerListener.setSelection(0);
0
koushick