【问题标题】:How to filter spinner based on other spinner selection?如何根据其他微调器选择过滤微调器?
【发布时间】:2018-03-05 15:27:02
【问题描述】:

我有 3 个 Spinner citySpinner、regionSpinner、branchSpinner,我可以在 spinners 中填充数据。问题是如果我从 spinnerRegion 中选择了 UP,那么在 citySpinner 我只想显示与该地区相关的城市。请帮助我。

在 arraylist 中,我现在成功存储了数据,如何根据微调器选择比较该数据?

 ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();
            final HashMap<String, String> m_li;
            m_li = new HashMap<String, String>();
            m_li.put("region", region);
            m_li.put("city", city);
            m_li.put("Branch", branch);
            formList.add(m_li);
            Log.d("DDDD----->", String.valueOf(formList));

【问题讨论】:

标签: android json


【解决方案1】:

在你的活动中使用它:

    final String JsonData = "[ { \"Br.Name\": \"A BRANCH\", \"Region\": \"UP(W)\", \"City\": \"Agra\" }, { \"Br.Name\": \"B BRANCH\", \"Region\": \"UP(W)\", \"City\": \"Bareilly\" }, { \"Br.Name\": \"C\", \"Region\": \"UP(W)\", \"City\": \"Baghpat\" }, { \"Br.Name\": \"D\", \"Region\": \"UP(E)\", \"City\": \"Amhat\" }, { \"Br.Name\": \"SE\", \"Region\": \"UP(E)\", \"City\": \"Bankeyganj\" }, { \"Br.Name\": \"F\", \"Region\": \"UP Central\", \"City\": \"HARDOI\" }, { \"Br.Name\": \"G\", \"Region\": \"UP(W)\", \"City\": \"Ghaziabad\" } ] ";
    spRegion = findViewById(R.id.spRegion);
    spCity = findViewById(R.id.spCity);


    spRegion.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            ArrayAdapter<String> CityAdapter = new ArrayAdapter<String>(Main2Activity.this, R.layout.support_simple_spinner_dropdown_item, getCity(JsonData, spRegion.getSelectedItem().toString()));
            spCity.setAdapter(CityAdapter);
        }

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

        }
    });

请在此类代码中替换您所在城市的源代码:

 public List<String> getCity(String JsonData, String SelectedRegion) {

    List<String> SpCityList = new ArrayList<>();
    String[] citys;
    try {
        JSONArray Array = new JSONArray(JsonData);

        for (int k = 0; k < Array.length(); k++) {

            try {
                JSONObject object = Array.getJSONObject(k);
                String Region = object.getString("Region");
                String City = object.getString("City");

                if (Region.equals(SelectedRegion)) {
                    SpCityList.add(City);
                }
            } catch (JSONException e) {
                e.printStackTrace();

            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }


    return SpCityList;
}

【讨论】:

  • 感谢您的回复,但我没有从字符串数组加载数据,而是从 JSON 文件中获取数据
  • @PraveenReddy 你能给我一个你自己的json样本吗?
  • { "XYZ":[ { "Br.Name": "A BRANCH", "Region": "UP(W)", "City": "Agra" }, { "Br.名称”:“B BRANCH”,“地区”:“UP(W)”,“城市”:“Bareilly”},{“Br.Name”:“C”,“地区”:“UP(W)”, “城市”:“巴格帕特”},{“Br.Name”:“D”,“地区”:“UP(E)”,“城市”:“Amhat”},{“Br.Name”:“SE” ,“地区”:“UP(E)”,“城市”:“Bankeyganj”},{“Br.Name”:“F”,“地区”:“UP Central”,“城市”:“HARDOI”}, { "Br.Name": "G", "Region": "UP(W)", "City": "Ghaziabad" }, ] }
【解决方案2】:

当您解析时,您必须进行映射 对于 ex HashMap> regionToCity = new HashMap(); regionToCity.put("UP", arralist 包含 Up 所在的城市); // 这必须在解析时完成。

看起来像

regionSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            String regionName = regiponList.get(position);
            cityList = regionToCity.get(regionName);
            //setAdapter of city spinner
        }

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

        }
    });

希望你明白我在说什么。试试这个然后告诉我

这是一个供您理解的示例。你想要达到的目标。

【讨论】:

  • 感谢您的回复兄弟,我无法分离 UP 城市列表,请帮我提供更多代码
【解决方案3】:

你必须在解析时根据你的json来管理数据

你必须改变你的json响应

{"UP":[
    {
        "Agra": [
                    {"Br.Name": "A BRANCH"},
                    {"Br.Name": "B BRANCH"},
                    {"Br.Name": "C BRANCH"}
                ]
    },
    {
        "Bareilly": 
                [
                    {"Br.Name": "A BRANCH"},
                    {"Br.Name": "B BRANCH"},
                    {"Br.Name": "C BRANCH"}
                ]
    }
],
"MP":[
    {
        "INDORE": [
                    {"Br.Name": "A BRANCH"},
                    {"Br.Name": "B BRANCH"},
                    {"Br.Name": "C BRANCH"}
                ]
    },
    {
        "BHOPAL": 
                [
                    {"Br.Name": "A BRANCH"},
                    {"Br.Name": "B BRANCH"},
                    {"Br.Name": "C BRANCH"}
                ]
    }
]
}

然后您可以将区域映射到城市列表和城市到分支列表

【讨论】:

    【解决方案4】:

    如果您想根据代码下方使用的其他微调器值显示微调器值,例如 ....

     private void setSpinser() {
        spCity = findViewById(R.id.city);
        spRegion = findViewById(R.id.reigon);
        List<String> cityName = new ArrayList<>();
        final List<String> regionName = new ArrayList<>();
        final ArrayAdapter<String> regionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        cityName.add("Select city");
        cityName.add("Ahmadabad");
        cityName.add("Surat");
        cityName.add("Delhi");
        ArrayAdapter<String> stringArrayAdapter = new ArrayAdapter<String>(DbInsert.this, android.R.layout.simple_list_item_1, cityName);
        spCity.setAdapter(stringArrayAdapter);
        spCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                switch (spCity.getSelectedItem().toString())
                {
                    case "Ahmadabad":
                        regionName.add("Abc");
                        regionName.add("cde");
                        regionName.add("efg");
                        regionAdapter.addAll(regionName);
                        spRegion.setAdapter(regionAdapter);
                        break;
                    case "Surat":
                        regionName.add("pqr");
                        regionName.add("stu");
                        regionName.add("xyz");
                        regionAdapter.addAll(regionName);
                        spRegion.setAdapter(regionAdapter);
                        break;
    
                }
            }
    
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
    
            }
        });
    }
    

    上述方法根据选择的第一个微调器值设置第二个微调器值,并且此方法在 oncreate 方法的 mainactivity 中调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多