2012-04-02 22 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