【问题标题】:Best practice to implement key-value pair in android Spinner在 android Spinner 中实现键值对的最佳实践
【发布时间】:2016-05-28 17:59:48
【问题描述】:

我想实现一个带有键值的 android spinner。

zh:英语 jp:日语

当用户选择和项目时,我想将密钥保存到数据库。而且在下一次加载时,我希望微调器选择一个微粒微调器位置。

谁能告诉我实现这一点的最佳方法是什么。

我已尝试关注但不符合我的要求 https://gist.github.com/granoeste/2786663 Set Key and Value in spinner

现在写我正在使用 LinkedHashMapAdapter。但问题是,在这里我需要将位置存储在 DB 或本地共享首选项中。我不认为这是一个更好的解决方案

当前实现

LinkedHashMap localeList = new LinkedHashMap<>();

        for (Map.Entry<String, String> val : map.entrySet()) {
            int resourceId = getResources().getIdentifier(val.getValue(), "string", getPackageName());
            localeList.put(val.getKey(), getResources().getString(resourceId));

        }
        LinkedHashMapAdapter<String, String> arrayAdapter = new LinkedHashMapAdapter<>(this, R.layout.spinner_layout, localeList);
        arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        mLocale.setAdapter(arrayAdapter);
        String localPosSelected = PreferencesHelper.getSharedPreferenceString(this, Constants.PREF_LOCALE_POS_KEY);
        if(localPosSelected!=null){
            mLocale.setSelection(Integer.parseInt(localPosSelected));
        }

还有一个选项可以按值选择 Spinner 的项目

【问题讨论】:

    标签: android android-spinner


    【解决方案1】:

    设置微调器:

            spLang = (Spinner)view.findViewById( R.id.spLang );
            spLang.setOnItemSelectedListener( this );
            ArrayList<String> sp_Lang = new ArrayList<String>();
            sp_Lang.add("english");
            sp_Lang.add("french");
            ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_spinner_item, sp_Lang);
            spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spLang.setAdapter(spinnerAdapter);
    

    对于 Perticular Spinner 项目选择:

    int Position = spinnerAdapter.getPosition("Japanese");
    spLang.setSelection(Position);
    

    首先为存储键值对创建Hashmap

    HashMap<String ,String> hmLang = new HashMap<String,String>();
    

    现在将这样的值添加到 HashMap 中:

    hmLang.put("english" ,"en");
    

    这里在 HashMap key = YourValue 和 Value = yourKey

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
        switch(adapterView.getId())
        {
            case R.id.spLang:
            String lang_Name = adapterView.getItemAtPosition(position).toString();
            String lang_Key = hmLang.get(lang_Name);
            break
    
        }
    

    如果您对此代码有任何问题,请询问

    【讨论】:

    • 您能否考虑一下这种情况。我将 JP 保存在数据库中。在下一次加载中,我希望在微调器中预先选择 JP(日语)。
    • 请检查我的更新答案并继续如果此答案有帮助,请投票。
    • 你建议我同时维护 ArrayList 和 HashMap 吗?
    • 供选择只需将此代码 int Position = spinnerAdapter.getPosition("Japanese"); spLang.setSelection(位置);
    • 有Hashmap用于从Spinner获取Selected Item的key。
    【解决方案2】:

    我使用HashMap 适配器创建用于这些场景。另见示例项目here

      mapData = new LinkedHashMap<String, String>();
    
        mapData.put("shamu", "Nexus 6");
        mapData.put("fugu", "Nexus Player");
        mapData.put("volantisg", "Nexus 9 (LTE)");
        mapData.put("volantis", "Nexus 9 (Wi-Fi)");
        mapData.put("hammerhead", "Nexus 5 (GSM/LTE)");
        mapData.put("razor", "Nexus 7 [2013] (Wi-Fi)");
        mapData.put("razorg", "Nexus 7 [2013] (Mobile)");
        mapData.put("mantaray", "Nexus 10");
        mapData.put("occam", "Nexus 4");
        mapData.put("nakasi", "Nexus 7 (Wi-Fi)");
        mapData.put("nakasig", "Nexus 7 (Mobile)");
        mapData.put("tungsten", "Nexus Q");
    
        adapter = new LinkedHashMapAdapter<String, String>(this, android.R.layout.simple_spinner_item, mapData);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    
        spinner = (Spinner) findViewById(R.id.spinner);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);
    

    【讨论】:

    • 我尝试使用它,但请告诉我如何获取所选项目的键和值。以及如何设置具有特定值的微调器
    • 您能否考虑一下这种情况。我将 JP 保存在数据库中。在下一次加载中,我希望在微调器中预先选择 JP(日语)。
    • ~ @Override public void onItemSelected(AdapterView> parent, View view, int position, long id) { Map.Entry item = (Map.Entry ) spinner.getSelectedItem();字符串键 = item.getKey();字符串 val = item.getValue(); } ~
    【解决方案3】:

    您可以将选定的spinner项目位置保存在数据库中,下次通过保存的位置设置spinner项目

    获取位置:
    int position = spinner1.getSelectedItemPosition();

    设置:
    spinner.setSelection(position);

    注意设置spinneradapter后应该调用setSelection()方法

    【讨论】:

    • 我不想在数据库中保存键 'en' 而不是 position 。这是我的要求
    【解决方案4】:

    您可以创建custom adapter for spinner 来实现此目的。

    使用自定义适配器

    • 您将能够使用您的 hashMap 作为键值对。
    • 您可以通过自定义视图进行更改。

    【讨论】:

      【解决方案5】:

      填充微调器

      void populateRecordPerPageSpinner(LinkedTreeMap<String, String> map) {
              String selectedValue = PreferencesHelper.getSharedPreferenceString(context, Constants.PREF_RECORD_PER_PAGE_KEY);
              List<String> recordPerPageList = new ArrayList();
      
              for (Map.Entry<String, String> val : map.entrySet()) {
                  int resourceId = getResources().getIdentifier(val.getValue(), "string", getPackageName());
                  recordPerPageMap.put(val.getKey(), getResources().getString(resourceId));
                  recordPerPageList.add(getResources().getString(resourceId));
              }
              ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, R.layout.spinner_layout, recordPerPageList);
              arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
              mRecordPerPage.setAdapter(arrayAdapter);
              mRecordPerPage.setSelection(arrayAdapter.getPosition(selectedValue));
      
          }
      

      优先获取和保存位置

      selectedRecPerPage = recordPerPageMap.get(mRecordPerPage.getAdapter().getItem(recordPerPagePosition));
      PreferencesHelper.setSharedPreferenceString(context, Constants.PREF_RECORD_PER_PAGE_KEY, selectedRecPerPage);
      

      【讨论】:

        【解决方案6】:

        我已更新 Dhaval 的 答案,使其更加通用。这个解决方案使用了toString()ArrayAdapter(你不需要用所有的逻辑实现你自己的适配器)并且在Kotlin

        中实现

        创建您的自定义类并覆盖toString() 方法。

        data class SpinnerEntry(
            // define whatever properties you want
            val label: String,
            val key: MyEnum,
        ) {
            override fun toString(): String {
                return label // this will display to user
            }
        }
        

        初始化微调器

        val entries = listOf(
            // you want to extract string resources to XML
            SpinnerEntry("LabelA", MyEnum.A),
            SpinnerEntry("LabelB", MyEnum.B),
            SpinnerEntry("LabelC", MyEnum.C),
            SpinnerEntry("LabelD", MyEnum.D),
        )
        
        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                val selectedItem = parent?.getItemAtPosition(position) as SpinnerEntry
                val key = selectedItem.key
                // do something with selected key
            }
        
            override fun onNothingSelected(parent: AdapterView<*>?) {
                // do something when unselected
            }
        }
        
        val spinnerAdapter: ArrayAdapter<SpinnerEntry> = ArrayAdapter(
            applicationContext!!, // get context depending on your implementation
            android.R.layout.simple_spinner_item,
            entries
        )
                    
        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        spinner.adapter = spinnerAdapter
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-29
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多