2017-04-26 5 views
0

Ich habe ein Problem mit der ersten Element ausgewählt im Spinner-Dropdown-Menü. Wenn der Spinner zum ersten Mal initialisiert wird, wird die Zeile mit der Ansicht "Nichts ausgewählt" gefüllt. Wenn im Dropdownmenü etwas ausgewählt wird, wird die Ansicht des Spinner mit dem ausgewählten Wert aus dem Dropdown-Menü geändert. Das funktioniert in jedem Fall außer in dem Fall, wenn ich direkt nach der Initialisierung den ersten Punkt anwähle. Was ich versuche zu sagen, ist, dass der Wert der Spinner-Zeile den Wert des ausgewählten Elements in jedem Fall außer dem 0-Element in das Dropdown-Feld schreibt. Wenn das Element 0> zuvor ausgewählt wurde, wird das Nullelement nur im Drehfeld angezeigt. Wenn 0 direkt nach der Initialisierung von Spinner ausgewählt wird, wird es nicht angezeigt.Gewähltes Element an Position 0 in Android Spinner

Das führt mich zu dem Schluss, dass Adapter auf seltsame Weise funktioniert. Wenn der Spinner initialisiert wird, wird er mit dem Standardwert gefüllt. Wenn das ausgewählte Element über dem Standardwert liegt, wird der Standardwert geändert, aber wenn der Standardwert nicht geändert wird, bleibt der Status gleich. Mit anderen Worten, Spinner wechselt nur die Ansicht, wenn ein anderer Wert gewählt wurde als der aktuelle Wert. Eine andere Sache, die mich stört, ist, dass ich in der getView-Methode den richtigen Wert, die richtige Position, bekomme, aber die Ansicht wird sich sowieso nicht ändern. Wie etwas überschreibt Überschreibung Methode und wird nicht Ansicht lassen sich ändern, wenn der Wert 0.

Spinner in Fragment ist

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

Adapter

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

Ich denke, es könnte Probleme mit Ihrer Farbmatrix geben. Können Sie bitte Ihre Werte posten.getHair_color(); Antwort. –

+0

Wie ich geschrieben habe, habe ich keine Probleme mit den Werten, sondern zeige sie im Falle eines ersten Klicks, wenn der erste Wert angeklickt wird. Im getView an der Stelle vor tv.setText bekomme ich immer richtigen Wert und richtige Position. Aus irgendeinem Grund wird es nicht zeigen, wenn es 0 Position ist und eine höhere Position ist nicht zuvor ausgewählt. – tompadre

Antwort

0

ich mit einer Lösung zu kommen, verwaltet werden. Dies ist der Adapter, der für den Spinner funktioniert, der einen Standardwert haben kann, wenn nichts ausgewählt ist

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