2012-04-02 7 views
11

Ich möchte zwei Werte in einer Dropdown-Ansicht meines Spinner anzeigen.Beispiel für benutzerdefinierte setDropDownViewResource Spinner Element

Derzeit hat es nur einen Städtenamen, aber ich möchte auch ein kleines Distanzfeld hinzufügen.

MyCity<MyCityDistance> dataAdapter; 

    dataAdapter = new MyCity(this, R.layout.mycityrow, list); 
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

Ich habe den gesamten Code für benutzerdefinierte Datenadapter, exapanding meine Ansicht und Halter usw.

jedoch die Position, die Show wird nicht angezeigt, sowohl die Stadt und ihre Entfernung von meinem aktuellen Standort.

Es wird nur angezeigt, was in der toString() - Methode der MyCityDistance-Klasse überschrieben wird.

Ich habe sogar versucht

dataAdapter.setDropDownViewResource(R.layout.mycityrow);

aber keinen Erfolg einstellen. Es wirft einen Fehler auf.

04-02 11:05:22.600: E/AndroidRuntime(367): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
04-02 11:05:22.600: E/AndroidRuntime(367): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347) 
04-02 11:05:22.600: E/AndroidRuntime(367): at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:376) 
04-02 11:05:22.600: E/AndroidRuntime(367): at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:332) 

Was ist ein gutes Beispiel Ihre eigenen Erstellungs setDropDownViewResource()?

Auch wenn ich die setDropDownViewResource() Zeile kommentieren, bekomme ich den gleichen Fehler.

Hinweis: Der einzige Effekt mycityrow aktuell ist, dass das erste Element von Spinner gemäß dem Layout mycityrow angezeigt wird. Wenn ich jedoch auf das Drop-down-Menü klicke, ist das Layout verloren. Ich möchte das gleiche Layout auch während der Dropdown-Auswahl.

Antwort

20

Beachten Sie das folgende Beispiel verwendet die eingebaute android.R.layout.simple_list_item_2, Leider wird die Textfarbe wahrscheinlich die gleiche wie der Hintergrund sein. Sie können dies einfach lösen, indem Sie Ihre eigene benutzerdefinierte Ansicht erstellen und stattdessen im Adapter verwenden.

Lassen Sie mich wissen, wenn ich irgendeinen Teil davon erklären sollte.

public class MainActivity extends Activity { 

    class City { 
     public City(String city, int d) { 
      this.city = city; 
      this.distance = String.valueOf(d); 
     } 

     String city; 
     String distance; 
    } 

    class CityAdapter extends ArrayAdapter<City> { 

     public CityAdapter(Context context, List<City> objects) { 
      super(context, android.R.layout.simple_list_item_2, objects); 
     } 

     @Override //don't override if you don't want the default spinner to be a two line view 
     public View getView(int position, View convertView, ViewGroup parent) { 
      return initView(position, convertView); 
     } 

     @Override 
     public View getDropDownView(int position, View convertView, 
            ViewGroup parent) { 
      return initView(position, convertView); 
     } 

     private View initView(int position, View convertView) { 
      if(convertView == null) 
       convertView = View.inflate(getContext(), 
              android.R.layout.simple_list_item_2, 
              null); 
      TextView tvText1 = (TextView)convertView.findViewById(android.R.id.text1); 
      TextView tvText2 = (TextView)convertView.findViewById(android.R.id.text2); 
      tvText1.setText(getItem(position).city); 
      tvText2.setText(getItem(position).distance); 
      return convertView; 
     } 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Spinner spinner = (Spinner)findViewById(R.id.spinner1); 
     List<City> list = new ArrayList<MainActivity.City>(); 
     for(int i = 0; i < 10; i++) 
      list.add(new City(String.format("City %d", i + 1), (i + 1) * 1000)); 
     spinner.setAdapter(new CityAdapter(this, list)); 

    } 

} 
+0

Ich frage mich, wie es mit einem Null-Elternteil funktioniert? –

+0

Das Übergeben des übergeordneten Elements als null entspricht dem Übergeben von 'attachToRoot' als false, wenn mit dem LayoutInflater aufgebläht wird. – st0le

+0

Habe die Lösung diesen Code implementieren :) Danke –

1

Versuchen Sie, die Zeile dataAdapter.setDropDownViewResource() zu kommentieren, und der Adapter wird versuchen, auch die mycityow-Layoutdatei für das Dropdown zu verwenden. Funktioniert in einfachen Fällen.

+0

Danke, ich habe diesen Ansatz früher versucht, meine Frage jetzt zu aktualisieren. –

Verwandte Themen