Search code examples
androidjsonandroid-spinner

OnItemSelectedListener method in Spinner is not called when i set JSON data to Spinner Android


When I select static data for spinner, its OnItemSelectedListener method works fine, but when I add the JSON data to the spinner, it populates the JSON data and its OnItemSelectedListener is not getting called. What could be the problem? Here is my code:

class list_Activity extends Activity implements OnItemSelectedListener {

  ProgressDialog progressDialog;
  RequestQueue requestQueue;
  String json_id;
  String json_dept;
  List<String> spinner_dept;
  List<String> categories;
  String selectedCity;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_);
    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading");
    progressDialog.show();

    // Spinner element
    Spinner spinner = (Spinner) findViewById(R.id.spinner3);
    requestQueue= Volley.newRequestQueue(this);

    // Spinner click listener
    spinner.setOnItemSelectedListener(this);

    // Spinner Drop down elements

    spinner_dept = new ArrayList<String>();
    categories = new ArrayList<String>();
    categories.add("Automobile");
    categories.add("Business Services");
    categories.add("Computers");
    categories.add("Education");
    categories.add("Personal");
    categories.add("Travel");

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
      Request.Method.GET,
      "http://192.168.1.104/leave/public/api/department",
      null,
      new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
          progressDialog.dismiss();
          try {
            JSONArray jsonArray = response.getJSONArray("data");

            for (int i = 0; i < jsonArray.length(); i++) {
              JSONObject jsonObject = jsonArray.getJSONObject(i);

              String b = jsonArray.getJSONObject(i).getString("department");
              spinner_dept.add(b);

              json_id = jsonObject.getString("identity");
              json_dept = jsonObject.getString("department");

              department deprt = new department();

              deprt.setId(json_id);
              deprt.setDepartment(json_dept);

              // spinner_data.add(deprt);

              // spinner_dept.add(jsonObject.getString("department"));

              //textView.append( id+" "+ first_name + " " + last_name + "\n");
            }
          } catch (JSONException e) {
            e.printStackTrace();
          }
        }
      },
      new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
          Log.d("error", "error from server response");
        }
      });

    requestQueue.add(jsonObjectRequest);

    // Creating adapter for spinner
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinner_dept);

    // Drop down layout style - list view with radio button
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // attaching data adapter to spinner
    spinner.setAdapter(dataAdapter);
  }

  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    // On selecting a spinner item
    String item = parent.getItemAtPosition(position).toString();
    // selectedCity = spinner.getSelectedItem().toString();
    if (position != 0) {
      //put your actions here
      String ch =spinner_dept.get(position);

      Toast.makeText(parent.getContext(), "Selected: " + selectedCity, Toast.LENGTH_LONG).show();
    } else {
      // nothing here or toast
      Toast.makeText(parent.getContext(), "Selected: " , Toast.LENGTH_LONG).show();
    }

    // Showing selected spinner item
  }

  public void onNothingSelected(AdapterView<?> arg0) {
    // TODO Auto-generated method stub
  }
}

Solution

  • You are not refreshing your adapter after adding data. Do the following changes and it will work.

    // Creating adapter for spinner
    final ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinner_dept);
    
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, "http://192.168.1.104/leave/public/api/department"
            , null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
    
            progressDialog.dismiss();
            try {
                JSONArray jsonArray = response.getJSONArray("data");
    
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
    
                    String b = jsonArray.getJSONObject(i).getString("department");
                    spinner_dept.add(b);
    
                    json_id = jsonObject.getString("identity");
                    json_dept = jsonObject.getString("department");
    
    
                    department deprt = new department();
    
                    deprt.setId(json_id);
                    deprt.setDepartment(json_dept);
    
                   // spinner_data.add(deprt);
    
                   // spinner_dept.add(jsonObject.getString("department"));
    
                    //textView.append( id+" "+ first_name + " " + last_name + "\n");
    
                }
    
             //Add this to refresh the spinner adapter
             dataAdapter.notifyDataSetChanged();
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
    
            Log.d("error", "error from server response");
        }
    }
    
    );
    
    
    requestQueue.add(jsonObjectRequest);