1

私は 2 つのスピナーを使用している Android アプリを作成しています。最初のスピナーでは、正常に実行した JSON からのデータを表示しています。ここで、最初のスピナーの項目をクリックして、別の JSON サービスからのデータを 2 番目のスピナーに表示する必要があります。

最初のサービス (city_name最初のスピナーでこのサービスから表示しています):

{"result":{"data":[{"city_id":"16","city_name":"\u00c4ngelholm"},
{"city_id":"23","city_name":"B\u00e5stad"},
{"city_id":"22","city_name":"Halmstad"},
{"city_id":"19","city_name":"H\u00f6gan\u00e4s"},{"city_id":"20","city_name":"Helsingborg"},
{"city_id":"15","city_name":"Klippan"},
{"city_id":"24","city_name":"Kungsbacka"},
{"city_id":"21","city_name":"Laholm"},{"city_id":"18","city_name":"Landskrona"}],
"status":"true","description":""}} 

セカンドサービス:

{"result":{"data":[{"category_id":"18","category":"Aff\u00e4rsverksamhet",
"city_id":"16","city_name":"\u00c4ngelholm"},{"category_id":"19","category":"\u00d6vrigt",
"city_id":"16","city_name":"\u00c4ngelholm"},{"category_id":"13","category":"Bostad",
"city_id":"16","city_name":"\u00c4ngelholm"},{"category_id":"15","category":"Elektronik",
"city_id":"16","city_name":"\u00c4ngelholm"},{"category_id":"12","category":"F\u00f6r hemmet","city_id":"16","city_name":"\u00c4ngelholm"},{"category_id":"11","category":"Fordon",
"city_id":"16","city_name":"\u00c4ngelholm"},
{"category_id":"16","category":"Fritid & Hobby",
    "city_id":"16","city_name":"\u00c4ngelholm"}],
    "status":"true","description":""}}

city_id両方のサービスでわかるように、city_name共通のフィールドです。city_name最初のスピナーから選択すると、 city_idorを介して一致し、それに対してcity_name表示されます。categorycity_name

以下は私が試した私のコードです。

 private class AllCities extends AsyncTask<String, String, JSONObject>
    {
        @Override
        protected void onPreExecute() 
        {
            super.onPreExecute();
        }

        @Override
        protected JSONObject doInBackground(String... params) 
        {
            try
            {
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost("url of First Service");

                HttpResponse resp = client.execute(post);

                HttpEntity entity = resp.getEntity();

                String response = EntityUtils.toString(entity);

                return new JSONObject(response);

            }

            catch(Exception ex)
            {
                ex.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(JSONObject result) 
        {
            super.onPostExecute(result);


            if(result != null)
            {
                myList = new ArrayList<HashMap<String,String>>();

                if(! result.has("false"))
                {
                    try
                    {
                        JSONObject object = result.getJSONObject("result");


                        JSONArray array = object.getJSONArray("data");

                        stringArray = new ArrayList<String>();

                        for(int i=0; i<array.length(); i++)
                        {   
                            HashMap<String, String> map = new HashMap<String, String>();
                            map.put("city_id", array.getJSONObject(i).getString("city_id"));                            
                            map.put("city_name", array.getJSONObject(i).getString("city_name"));
                            myList.add(map);

                            stringArray.add(array.getJSONObject(i).getString("city_name"));


                        }

                        ArrayAdapter<String> adapter = new ArrayAdapter<String>(PostAdds.this, 
                                android.R.layout.simple_spinner_item, stringArray);
                        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spinner_city.setAdapter(adapter);

                    }

                    catch(Exception ex)
                    {
                        ex.printStackTrace();
                    }

                }

            }

            else if(result == null)
            {
                Toast.makeText(PostAdds.this, 
                        "Hittade inga Detaljer Vänligen Kontrollera din Internet-anslutning", 
                        Toast.LENGTH_LONG).show();
            }

        }
    }

 @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
    {   
        //what am I suppose to do here????

    }

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


    }
4

1 に答える 1

0

返事が遅くなってすみません。私はこれを自分で解決しましたが、ここに戻って私のために働いた解決策を投稿することはありませんでした。同じ種類の問題を抱えている人がここから助けを得ることができる場合は、この回答を投稿しています。

だから私がしたこと

1)最初のサービスを呼び出し、最初のスピナーに都市名を入力し、アイテムが最初のスピナーで選択されたら、その値を次のようなグローバル文字列に保存します

String selectedCity; selectedCity = spinner1.getSelectedItem().toString();

2)最初のスピナーの任意の項目をクリックすると、2 番目のサービスが呼び出され、2 番目のスピナーにデータが入力されている間に簡単なチェックが行われます。

    ArrayList<String> categories = new ArrayList<String>();
    try {
           JSONObject object = result.getJSONObject("result");
           JSONArray array = object.getJSONArray("data");

           for(int a = 0; a < array.length(); a++) {
                 String cityName = array.getJSONObject(a).getString("city_name");
                if(cityName.equals(selectedCity)) // this check is important
                {
                        categories.add(cityName );
                }
          }
         // after for loop ends populate adapter of second spinner 
         ArrayAdapter<String> adapt = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, categories);
         spinner2.setAdapter(adapt);
    }
    catch(Exception e) {
          e.printStackTrace();
    }

このようにして、私は望ましい結果を得ました。この問題には他にも解決策があります。その 1 つは、2 番目のサービス パス city_id または city_name をパラメーターとして URL とともに呼び出すと、サービスは目的のカテゴリのみを返す場合です。

これが同様の種類の問題を抱えている人にとって解決することを願っています。今日、自分のStackoverflowプロフィールを確認したところ、この質問には誰も答えていないことがわかったので、自分で答えました:)

于 2015-11-20T12:09:04.810 に答える