2012-04-02 20 views
11

我想在我的微調控制器的下拉視圖中顯示兩個值。自定義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);

,但沒有成功。它會引發錯誤。

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()的一個很好的例子?

即使我註釋掉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

我不知道它是如何與一個空的父母工作? – 2012-04-05 07:51:00

+0

將父項傳遞爲null相當於在使用LayoutInflater充氣時將'attachToRoot'設置爲false。 – st0le 2012-04-05 08:27:39

+0

得到了解決這個代碼的工具:)謝謝 – 2014-12-17 09:39:14

1

嘗試對行dataAdapter.setDropDownViewResource()進行註釋,並且適配器也會嘗試使用mycityow佈局文件作爲下拉列表。在簡單的情況下工作。

+0

謝謝,我之前嘗試過這種方法,現在更新我的問題。 – 2012-04-02 18:10:57