2012-04-02 4 views
11

私のスピナーのドロップダウンビューに2つの値を表示したいと思います。カスタムsetDropDownViewResourceスピナーアイテムの例

現在のところ、都市名はありますが、小さな距離フィールドも追加したいと考えています。

MyCity<MyCityDistance> dataAdapter; 

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

私はなど私の見解とホルダーをexapanding、カスタムデータアダプタのすべてのコードを持っている

しかし、ショーを取得した項目は、私の現在の場所から、市内とその距離の両方を表示しません。

MyCityDistanceクラスのtoString()メソッドでオーバーライドされている内容のみを示します。

私も

dataAdapter.setDropDownViewResource(R.layout.mycityrow);

しかし、ない成功を設定してみました。エラーが発生します。独自のカスタムsetDropDownViewResource()を作成する良い例は

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) 

は何ですか?

setDropDownViewResource()行をコメントアウトしても、同じエラーが発生します。

注:mycityrowの現在の唯一の効果は、Spinnerの最初の要素がmycityrowのレイアウトに従って表示されていることです。しかし、ドロップダウンを開くと、そのレイアウトは失われます。ドロップダウン選択時にも同じレイアウトが必要です。

答えて

20

以下の例では、組み込みのandroid.R.layout.simple_list_item_2を使用しています。残念ながら、テキストの色はおそらく背景と同じになります。独自のカスタムビューを作成してアダプタで代わりに使用するだけで、この問題を解決できます。

私はそれの一部を説明する必要がある場合は教えてください。

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

それはnullの親とどのように動作するのだろうか? –

+0

親をnullにすることは、LayoutInflaterを使って膨張させたときに 'attachToRoot'をfalseとして渡すのと同じです。 – st0le

+0

このコードを実装するソリューションを得ました:)ありがとう –

1

dataAdapter.setDropDownViewResource()の行をコメントしてみると、アダプタはドロップダウン用のmycityowレイアウトファイルも使用しようとします。簡単なケースで動作します。

+0

ありがとうございました。以前はこのアプローチを試していましたが、私の質問を更新しました。 –

関連する問題