Search code examples
androidjsonspinnerstring-parsing

Spinner not populating with json data


I am building a app to upload images to my company server. The issue I have run into I have to make 2 spinners one to select an upload category and another to select a client, I am in testing phase with this now, the problem is my Spinner doesnt populate with the JSON data at all the json data is stored in a ASP file if that matters I have only been coding for about 2 weeks so any help would be aprecieted.

Json data

{ "success": 1, "Name": [ { "Country": "India" }, { "Country": "US" }, { "Country": "UK" }, { "Country": "Australia" }, { "Country": "Canada " } ] }

MainActivity

public class MainActivity extends AppCompatActivity {
    Spinner spinner;
    String URL="https://www.smartpractice.co.za/app-categories.asp";
    ArrayList<String> CountryName;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CountryName=new ArrayList<>();
        spinner=(Spinner)findViewById(R.id.country_Name);
        loadSpinnerData(URL);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String country=   spinner.getItemAtPosition(spinner.getSelectedItemPosition()).toString();
                Toast.makeText(getApplicationContext(),country,Toast.LENGTH_LONG).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // DO Nothing here
            }
        });
    }
    private void loadSpinnerData(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 country=jsonObject1.getString("Country");
                            CountryName.add(country);
                        }
                    }
                    spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, CountryName));
                }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);
    }
}

Solution

  • JSONObject jsonObject = new JSONObject(response); is the Mistake (casting error)

    because in your response ClientID, Username and Pwd all are a string so it gives Error. and as you write in try-catch method your app is not crashing.

    => You just to do String array = response.substring(47); before giveing response to JSONObject. (so it removes all above value and start from your array which have values)

    => and after that replace response to array. It will work definitely.

    Example:-

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.i(TAG, "onResponse: " + response);
                String array = response.substring(47);
                Log.i(TAG, "onResponse: array " + array);
                try {
                    JSONObject jsonObject = new JSONObject(array);
                    Log.i(TAG, "onResponse: success :- " + jsonObject.getInt("success"));
                    if (jsonObject.getInt("success") == 1) {
                        Log.i(TAG, "onResponse: Name :- " + jsonObject.getJSONArray("Name"));
                        JSONArray jsonArray = jsonObject.getJSONArray("Name");
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                            Log.i(TAG, "onResponse: Country :- " + jsonObject1.getString("Country"));
                            String country = jsonObject1.getString("Country");
                            CountryName.add(country);
                        }
                    }
                    spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, CountryName));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
         }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {
             error.printStackTrace();
         }
    });
    

    Replace above request in you request