【问题标题】:Set Key and Value in spinner在微调器中设置键和值
【发布时间】:2014-09-02 22:52:42
【问题描述】:

我有一个微调器,我想在上面设置一个键和一个值,我使用 HashMap,它可以工作,但显示一行,像这样:

代码:

        final View rootView = inflater.inflate(R.layout.fragment_photos, container, false);

    Spinner spin=(Spinner)rootView.findViewById(R.id.spinner1);

    HashMap<Integer, String> P_Hash=new HashMap<Integer, String>();

    Update Get_Information=new Update(rootView.getContext());

    ArrayList<String> Province_NAME=new ArrayList<String>();
    Province_NAME=Get_Information.GET_Province();

    ArrayList<Integer> Province_ID=new ArrayList<Integer>();
    Province_ID=Get_Information.Get_Province_ID();

    for (int i = 0; i < Province_ID.size(); i++)
    {
        P_Hash.put(Province_ID.get(i), Province_NAME.get(i));
        Log.d("Province_ID.get(i)", Province_ID.get(i)+"");
        Log.d(" Province_NAME.get(i)",  Province_NAME.get(i)+"");
    }


    ArrayAdapter<HashMap<Integer, String>> adapter = new ArrayAdapter<HashMap<Integer,String>>(rootView.getContext(), android.R.layout.simple_spinner_item);
    adapter.add(P_Hash);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spin.setAdapter(adapter);

【问题讨论】:

    标签: android hashmap spinner


    【解决方案1】:

    使用键和值填充微调器的更好方法应该是:

    第 1 步:创建将处理键和值的 POJO 类

    public class Country {
    
        private String id;
        private String name;
        
        public Country(String id, String name) {
            this.id = id;
            this.name = name;
        }
    
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    
        //to display object as a string in spinner
        @Override
        public String toString() {
            return name;
        }
    
        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Country){
                Country c = (Country )obj;
                if(c.getName().equals(name) && c.getId()==id ) return true;
            }
    
            return false;
        }
    
    }
    



    注意: toString() 方法很重要,因为它负责在 spinner 中显示数据,您可以根据需要修改 toString()

    第 2 步:准备要加载到微调器中的数据

     private void setData() {
    
            ArrayList<Country> countryList = new ArrayList<>();
            //Add countries
    
            countryList.add(new Country("1", "India"));
            countryList.add(new Country("2", "USA"));
            countryList.add(new Country("3", "China"));
            countryList.add(new Country("4", "UK"));
    
            //fill data in spinner 
            ArrayAdapter<Country> adapter = new ArrayAdapter<Country>(context, android.R.layout.simple_spinner_dropdown_item, countryList);
            spinner_country.setAdapter(adapter);
            spinner_country.setSelection(adapter.getPosition(myItem));//Optional to set the selected item.    
        }
    

    第三步:最后在spinner的onitemselected监听器方法中获取选中项的key和value

    spinner_country.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    
                     Country country = (Country) parent.getSelectedItem();
                     Toast.makeText(context, "Country ID: "+country.getId()+",  Country Name : "+country.getName(), Toast.LENGTH_SHORT).show();    
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> parent) {    
                }
            });
    

    【讨论】:

    • @SrinivasGuni 先生很好的例子。先生,我需要帮助,您能解释一下为什么要覆盖 onItemSelected 方法吗?我尝试不覆盖但没有工作。那你能解决我的问题吗
    • @jayanta 首先是好问题我们正在使用 arrayadapter 作为数据集(我们的国家列表)和适配器视图之间的桥梁,即微调器的每一行。因此,每当您希望单击侦听器为每个行选择工作时,您都必须覆盖 Adapterview 接口的 onitemselected 侦听器所以每次单击微调器行时,都会调用此方法,您可以在单击该行时执行任何操作。希望它会有所帮助
    • 你应该强调“toString()”方法部分,伙计。这是关键。我编辑了你的解释,我希望有人接受我的编辑
    • @Dika 我已经这样做了,你可以看到注释部分。可能是你跳过了那部分。
    • @SrinivasGuni 为什么要覆盖 POJO 中的 equals 方法?可以在微调器中设置选择吗?您能否在 equals 方法上方添加一个解释,说明您为什么要覆盖它?
    【解决方案2】:

    尝试使用 HashMap 来存储 Key-Value 对数据,在你的情况下 spinner item index 作为 keyProvince_ID 作为值。查看以下示例了解更多详情。

    为微调器准备值

    String[] spinnerArray = new String[Province_ID.size()];
    HashMap<Integer,String> spinnerMap = new HashMap<Integer, String>();
    for (int i = 0; i < Province_ID.size(); i++)
    {
       spinnerMap.put(i,Province_ID.get(i));
       spinnerArray[i] = Province_NAME.get(i);
    }
    

    设置微调器的值

    ArrayAdapter<String> adapter =new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item, spinnerArray);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
    

    为微调器创造价值

    String name = spinner.getSelectedItem().toString();
    String id = spinnerMap.get(spinner.getSelectedItemPosition());
    

    【讨论】:

    • @HareshChhelana,谢谢你的好例子。对于 spinnerArray、province_NAME 和 Province_ID,我使用了 arraylists,因为它使一些对象处理更容易,所以我只有 spinnerArray.add(provinceName.get(i)); 而不是 spinnerArray[i] = ...这可能有助于解决一些索引越界问题。无论如何,感谢您的出色解决方案!
    • @HareshChhelana 我不确定,但 hashmap 是否保留插入顺序? (我记得 hashmap 和随机顺序存在一些问题)。
    • @medskill,根据更改,我将存储索引作为键,将 id 作为值,因此它将解决微调项中同名的问题。
    • 要保持插入元素的顺序,您应该使用 LinkedHashMap
    • 无需创建第二个数组 spinnerArray,只需使用 spinnerMap.values():
    【解决方案3】:

    使用 LinkedHashMap 并将“您希望在微调器中显示的字符串”存储为键,并将您希望根据微调器选择检索的对象存储为值。例如。 ,由于某种原因,您有一个与微调器项关联的 Float 数据类型,请使用:

    LinkedHashMap<String , Float> aMap = new LinkedHashMap<>(10);
    

    然后对于微调器,我们可以将值设置为:

        ArrayList<String> values = new ArrayList<>(aMap.keySet());
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item,values);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    

    最后,在 OnItemSelectedListener 中,检索浮点值:

     @Override
     public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    aMap.get(adapterView.getItemAtPosition(i));
                    
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2016-08-07
      • 2015-12-03
      相关资源
      最近更新 更多