如何显示具有隐藏值的微调器

Posted

技术标签:

【中文标题】如何显示具有隐藏值的微调器【英文标题】:How to Display a spinner with Hidden Values 【发布时间】:2020-03-21 13:52:38 【问题描述】:

在我的应用程序中,我有几个 Spinners 填充了 JSON 数据

此应用用于记录工作时间

所以我正在努力解决的问题是,其中一个微调器必须显示与传递给 URL 以进行发布的值不同的值

所以基本上 Spinner 会显示 3 个这样的项目

1 项的示例,

UserID - UserRate - Value

所以它在微调器中看起来像这样

7 - 1 - $200

整个字符串是数组中的 1 个 Json 对象

我使用用户 ID 和第二个数字服务器端将信息发布到表格以记录小时数 所以我只想在微调器下拉列表中显示 $200,但将整行传递给 URL 以进行发布

用于填充微调器的代码

 private void LoadUserRatesSpinnerData(String url) 
        RequestQueue requestQueue=Volley.newRequestQueue(getApplicationContext());
        StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() 
            @Override
            public void onResponse(String response) 

                try 
                    JSONObject jsonObject=new JSONObject(response);
                    if (jsonObject.getInt("success") == 1) 
                        JSONArray jsonArray=jsonObject.getJSONArray("Name");
                        for (int i=0; i < jsonArray.length(); i++) 
                            JSONObject jsonObject1=jsonArray.getJSONObject(i);
                            String rates=jsonObject1.getString("UserRate");
                            UserRate.add(rates);
                        
                    
                    UserRatesSpinner.setAdapter(new ArrayAdapter<>(IntTimeLog.this, android.R.layout.simple_spinner_dropdown_item, UserRate));
                 catch (JSONException e) 
                    e.printStackTrace();


                
            
        , new Response.ErrorListener() 
            @Override
            public void onErrorResponse(VolleyError error) 

                error.printStackTrace();
            
        );
        int socketTimeout=30000;
        RetryPolicy policy=new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        stringRequest.setRetryPolicy(policy);
        requestQueue.add(stringRequest);
    

【问题讨论】:

您面临的问题是什么? 苦苦挣扎,微调器必须显示与传递给 URL 以进行发布的值不同的值,因此它现在显示 7 - 1 - $200 但我只想显示 $200 但后端价值保持在 7-1-$200 我不知道该怎么做 这个“7 - 1 - $200”是否代表单个微调器项目?并且微调器中的所有项目是否都采用相同的格式 是的,这是一个单一的微调项目,所有项目都将完全相同,尽管第一个数字,即 7 可能是像 11 这样的两位数,第一个数字是从服务器提取的 USERID,所以它最多有 2 位数字,第二个数字是服务器知道选择女巫的数字,$ 是值 你试过我的答案了吗? 【参考方案1】:

你可以像这样实现同样的效果

 yourSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
         String value = yourList.get(position);
          String[]array = value.split("-")
          String yourValue = array[2].trim();
        

        @Override
        public void onNothingSelected(AdapterView<?> parent) 

        
    );

【讨论】:

我要求使用这个答案鲁本 我得到它的工作方式现在微调器中的结果项目现在看起来像这样 [7 , 1 , $200] 您想只显示微调器中的最后一个(200 美元)吗?【参考方案2】:

在 Spinner 中显示时,您实际上应该使用 RegX 来格式化此文本, 您的 REGX 可能看起来像这样

final String str = "7 - 1 - $200";
final Matcher matcher = Pattern.compile("$").matcher(str);
if(matcher.find())
    System.out.println(str.substring(matcher.end()).trim()); //This should give you 200

【讨论】:

那么我怎样才能将原始值传递给字符串以用于上传等目的? 你应该把它保存在一个单独的字符串中,在发送数据时你应该使用那里的实际值。如果您想要完整的解决方案,我可能需要您在设置文本的位置完成代码 您的代码只提供静态字符串我用 JSON 动态填充微调器 我在您的代码中看到了这一点 String rates=jsonObject1.getString("UserRate");理想情况下,您应该将其替换为 rates = rates .substring(matcher.end()).trim() 我的意思是 String rates=jsonObject1.getString("UserRate");在下一行中,rates = rates .substring(matcher.end()).trim()【参考方案3】:

使用 Vinay 的答案,我已经对其进行了编辑并使其正常工作 我添加了一个 For 循环并编辑了匹配器

  for(int p=0; p < 100; p++)
                            final Matcher matcher=Pattern.compile(" - ").matcher(rates);
                            if (matcher.find()) 
                                rates =rates.substring(matcher.end()).trim();

【讨论】:

以上是关于如何显示具有隐藏值的微调器的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏和显示加载微调器 - 活动指示器反应原生,管理道具和状态

每当我选择微调器值时如何隐藏标签?

如何使用 HashMap 并在 ArrayAdapter 中使用它来显示微调器中的值

如何更改各种微调器值的 EditText 字段

Swift TableView Cell - 显示活动微调器,执行功能,隐藏活动微调器

Android:如何将微调器绑定到自定义对象列表?