自定义 setDropDownViewResource 微调项的示例

Posted

技术标签:

【中文标题】自定义 setDropDownViewResource 微调项的示例【英文标题】:Example of custom setDropDownViewResource spinner item 【发布时间】:2012-04-15 18:34:10 【问题描述】:

我想在微调器的下拉视图中显示两个值。

目前,它只有一个城市名称,但我还想在其中添加一个小的距离字段。

    MyCity<MyCityDistance> dataAdapter;  

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

我有自定义数据适配器的所有代码,扩展我的视图和持有者等。

但是,显示的项目不会同时显示城市及其与我当前位置的距离。

它只显示 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 的布局显示。但是,当我单击打开下拉菜单时,该布局将丢失。我也想在下拉选择中使用相同的布局。

【问题讨论】:

【参考方案1】:

请注意,下面的示例使用内置的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));

    


【讨论】:

在使用 LayoutInflater 膨胀时,将父级传递为 null 等效于将 attachToRoot 传递为 false。 嘿,感谢这个不错的解决方案。我有一个问题要问你:为什么我需要覆盖 getView() 和 getDropDownView()?为什么我只覆盖 getDropDownView() 时它不起作用?【参考方案2】:

尝试注释 dataAdapter.setDropDownViewResource() 行,适配器也会尝试将 mycityow 布局文件用于下拉菜单。适用于简单的情况。

【讨论】:

谢谢,我之前确实尝试过这种方法,现在更新我的问题。

以上是关于自定义 setDropDownViewResource 微调项的示例的主要内容,如果未能解决你的问题,请参考以下文章

自定义UI 自定义布局

自定义UI 自定义布局

自定义UI 自定义布局

自定义 view - 自定义属性

Springboot+自定义注解+自定义AOP前置增强+自定义异常+自定义异常捕获

Android 自定义View