2

I create spinner with adapter data from json. But why spinner not showing text and not show when selected value. Somebody can help me please.

Spinner

<Spinner android:id="@+id/spinCity"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:padding="15dp"
            android:textColor = "#000000"
            android:prompt="@string/city_prompt"
 />

Load json for spinner.

    cityItems = new ArrayList<City>();
    cityNames = new ArrayList<String>();

    JsonObjectRequest jsonReq = new JsonObjectRequest(
            AppConfig.URL_CITY, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            VolleyLog.d(TAG, "Response: " + response.toString());
            if (response != null) {
                try {
                    JSONArray feedArray = response.getJSONArray("result");

                    for (int i = 0; i < feedArray.length(); i++) {
                        JSONObject feedObj = (JSONObject) feedArray.get(i);

                        City item = new City();
                        item.setId(feedObj.getInt("id"));
                        item.setCity(feedObj.getString("city"));

                        cityItems.add(item);
                        cityNames.add(feedObj.getString("city"));
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
        }
    }){
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<String, String>();
            String credentials = AppConfig.USER_API+":"+AppConfig.PASSWORD_API;
            String auth = "Basic "
                    + Base64.encodeToString(credentials.getBytes(),
                    Base64.NO_WRAP);
            headers.put("Authorization", auth);
            return headers;
        }
    };
    VolleyController.getInstance().addToRequestQueue(jsonReq);

    spinCity = (Spinner) findViewById(R.id.spinCity);
    ArrayAdapter<String> cAdapter = new ArrayAdapter<String>
            (SendReportActivity.this, android.R.layout.simple_spinner_item, cityNames);

    cAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);


    spinCity.setAdapter(cAdapter);
    spinCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(getApplicationContext(),
                    "selected", Toast.LENGTH_LONG)
                    .show();
        }

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

        }
    });

And this screen shot when i run. enter image description here

user3089464
  • 251
  • 6
  • 14

2 Answers2

5

Because at first time your cityNames is empty and it need to refresh after received data from response. So, you need to call notifyDataSetChanged() to update data.

cityItems = new ArrayList<City>();
    cityNames = new ArrayList<String>();
    **final ArrayAdapter<String> cAdapter = new ArrayAdapter<String>
                (SendReportActivity.this, android.R.layout.simple_spinner_item, cityNames);**
JsonObjectRequest jsonReq = new JsonObjectRequest(
        AppConfig.URL_CITY, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        VolleyLog.d(TAG, "Response: " + response.toString());
        if (response != null) {
            try {
                JSONArray feedArray = response.getJSONArray("result");

                for (int i = 0; i < feedArray.length(); i++) {
                    JSONObject feedObj = (JSONObject) feedArray.get(i);

                    City item = new City();
                    item.setId(feedObj.getInt("id"));
                    item.setCity(feedObj.getString("city"));

                    cityItems.add(item);
                    cityNames.add(feedObj.getString("city"));
                }
                **cAdapter.notifyDataSetChanged();**

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


              }
            }
 ...
NamNH
  • 1,752
  • 1
  • 15
  • 37
  • Thanks @John, it's work. But, how can i show promt into spinner. I add android:promt in spinner but promt not showing. Maybe have another way ? – user3089464 Nov 03 '15 at 13:22
  • Prompt is used to show title on dropdown popup not for default text. There 're some suggestions from this [link](http://stackoverflow.com/questions/867518/how-to-make-an-android-spinner-with-initial-text-select-one/). Hope that help !. And you should also see [android:spinnerMode](http://developer.android.com/reference/android/widget/Spinner.html#attr_android:spinnerMode) for your favourite display. – NamNH Nov 03 '15 at 14:40
0

The Spinner most likely doesn't know about the data being added in your Response.Listener.

You need to do something like

Spinner s = (Spinner) findViewById(R.id.spinCity);
BaseAdapter a = (BaseAdapter) s.getAdapter();
if (a != null)
    a.notifyDataSetChanged();

after the for loop you call cityNames.add(feedObj.getString("city")) in.

tynn
  • 38,113
  • 8
  • 108
  • 143