2017-04-26 3 views
0

J'ai un problème avec le premier élément sélectionné dans le menu déroulant de spinner. Lorsque spinner est initialisé pour la première fois, la ligne est remplie avec "aucune vue sélectionnée" et lorsque quelque chose est sélectionné dans le menu déroulant, la vue spinner est modifiée avec la valeur sélectionnée dans la liste déroulante. Cela fonctionne dans tous les cas sauf dans le cas où je sélectionne le premier élément juste après l'initialisation. Ce que j'essaie de dire, c'est que la valeur de la ligne spinner écrit la valeur de l'élément sélectionné dans la liste déroulante dans tous les cas sauf pour 0 item. L'élément Zero n'apparaît dans Spinner que si l'élément 0> est sélectionné auparavant. Si 0 est sélectionné juste après l'initialisation de spinner, il ne s'affichera pas.Élément sélectionné à la position 0 dans android Spinner

Cela m'amène à la conclusion que l'adaptateur fonctionne de manière étrange. Lorsque spinner est initialisé, il est rempli par défaut. Ensuite, si l'élément sélectionné est au-dessus de la valeur par défaut, il changera cette valeur par défaut, mais si la valeur par défaut n'est pas modifiée, l'état reste le même? En d'autres termes, Spinner changera seulement la vue en cas de différente valeur choisie de la valeur actuelle? Une autre chose qui me dérange est que dans la méthode getView, j'obtiens la bonne valeur, la bonne position, mais la vue ne changera pas de toute façon. Comme quelque chose remplace la méthode de remplacement et ne laissera pas changer en vue de si la valeur est 0.

Spinner dans le fragment

spinnerHairColor.setAdapter(new CustomSpinnerAdapter(R.string.hair_color, 
    getContext(), R.layout.spinner_dropdown, values.getHair_color())); 
spinnerHairColor.setFocusableInTouchMode(true); 
spinnerHairColor.setOnFocusChangeListener(spinnerFocusListener); 

Adaptateur

public class CustomSpinnerAdapter extends ArrayAdapter<Values.ValuesProperty> implements SpinnerAdapter { 

private Context context; 
private List<Values.ValuesProperty> valuesProperty; 
protected LayoutInflater layoutInflater; 
private int unselectedText; 
private boolean init = false; 


public CustomSpinnerAdapter(int unselectedText, Context context, int nothingSelectedLayout, List<Values.ValuesProperty> valuesProperty) { 
    super(context, nothingSelectedLayout, valuesProperty); 

    this.unselectedText = unselectedText; 
    this.valuesProperty = valuesProperty; 
    layoutInflater = LayoutInflater.from(context); 
    this.context=context; 
    init = true; 
} 



@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false); 
     TextView tv = (TextView) row.findViewById(R.id.spinnerNothingText); 

     if (position == 0 && init) { 
      return getNothingSelectedView(parent); 
     } 

     Values.ValuesProperty v = getItem(position); 
     tv.setText(getContext().getText(unselectedText) + ": " + v.getName()); 
     return row; 
    } 



@Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
     Values.ValuesProperty v = getItem(position); 
     View row = layoutInflater.inflate(R.layout.item_spinner, parent, false); 
     TextView tv = (TextView) row.findViewById(R.id.spinnerText); 
     tv.setText(v.getName()); 
     return row; 
    } 

    protected View getNothingSelectedView(ViewGroup parent) 
    { 
     View backView = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false); 
     TextView tv = (TextView) backView.findViewById(R.id.spinnerNothingText); 
     tv.setText(getContext().getText(unselectedText)); 
     // to make sure if 0 is selected isnt inital 0 
     init = false; 
     return backView; 
    } 

} 
+0

Je pense qu'il pourrait y avoir un problème avec votre matrice de couleurs. pouvez-vous pls Publiez vos valeurs.getHair_color(); réponse. –

+0

Comme je l'ai écrit, je n'ai pas de problème avec les valeurs, mais avec les montrer dans le cas du premier clic si la première valeur est cliquée. Dans le getView au point avant tv.setText je reçois toujours la bonne valeur et la bonne position. Juste pour une raison quelconque, il ne montrera pas si c'est la position 0 et une position plus élevée n'est pas sélectionnée auparavant. – tompadre

Répondre

0

J'ai réussi à trouver une solution. Ceci est l'adaptateur qui fonctionne pour le spinner qui peut avoir une valeur par défaut si rien n'est sélectionné

public class CustomSpinnerAdapter extends ArrayAdapter<Values.ValuesProperty> implements SpinnerAdapter{ 

private Context context; 
private List<Values.ValuesProperty> valuesProperty; 
protected LayoutInflater layoutInflater; 
private int unselectedText; 
private boolean init = false; 

    public CustomSpinnerAdapter(int unselectedText, Context context, int nothingSelectedLayout, 
          List<Values.ValuesProperty> valuesProperty) { 
    super(context, nothingSelectedLayout, valuesProperty); 

    this.unselectedText = unselectedText; 
    this.valuesProperty = valuesProperty; 
    layoutInflater = LayoutInflater.from(context); 
    this.context = context; 
    init = true; 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View row = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false); 
    TextView tv = (TextView) row.findViewById(R.id.spinnerNothingText); 

    if (position == 0 && init) { 
     init = false; 
     tv.setText(getContext().getText(unselectedText)); 
     return row; 
    } 

    Values.ValuesProperty v = getItem(position); 
    if (position == 0 && parent.hasFocus()) 
     notifyDataSetChanged(); 

    tv.setText(getContext().getText(unselectedText) + ": " + v.getName()); 
    return row; 
} 


    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    Values.ValuesProperty v = getItem(position); 
    View rowDrop = layoutInflater.inflate(R.layout.item_spinner, parent, false); 
    TextView tvDrop = (TextView) rowDrop.findViewById(R.id.spinnerText); 
    tvDrop.setText(v.getName()); 
    return rowDrop; 
    } 
}