J'essaie d'obtenir les données du serveur dans mon spinner, mais quand j'ai essayé avec ce code, je ne reçois rien, il n'affiche aucune donnée dans le spinner. voici mon fichier Home.java:

   public class Home extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener {

    private Spinner countrySpinner, locationSpinner, citySpinner;
    private TextView cityCodeTextView;
    private Button submitButton;
    private ArrayList<String> country_list, location_list, city_list;
    private JSONArray result;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        countrySpinner = (Spinner) findViewById(Country);
        //citySpinner = (Spinner) findViewById(City);
        //locationSpinner = (Spinner) findViewById(R.id.Location);
        countrySpinner.setOnItemSelectedListener(this);

        country_list = new ArrayList<String>();
        //location_list = new ArrayList<String>();
        // city_list = new ArrayList<String>();

        getData();
    }
    private void getData(){
        StringRequest
                stringRequest = new StringRequest(Config.DATA_URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        JSONObject j = null;
                        try {
                            Log.d("Test",response);
                            j = new JSONObject(response);

                            //Storing the Array of JSON String to our JSON Array
                            result = j.getJSONArray(Config.JSON_ARRAY);

                            //Calling method getStudents to get the students from the JSON Array
                            getCountry(result);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
                RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Adding request to the queue
        requestQueue.add(stringRequest);
    }

    private void   getCountry(JSONArray  jsonArrayCountry){
        //Traversing through all the items in the json array
        List<Country> countries = new ArrayList<>();

        try {

            String country_name, country_code;
            JSONObject countries_object;


            for (int i = 0; i < jsonArrayCountry.length(); i++) {
                countries_object = jsonArrayCountry.getJSONObject(i);
                country_code = countries_object.getString("id");
                country_name = countries_object.getString("country");
                countries.add(new Country(country_code, country_name));
            }
            ArrayAdapter countryAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, countries);
            countrySpinner.setAdapter(countryAdapter);
            countrySpinner.setOnItemSelectedListener(this);
        } catch (JSONException e) {
            Log.e("Home", e.getLocalizedMessage(), e);
        }



    }

    //Method to get student name of a particular position

    //Doing the same with this method as we did with getName()


    //Doing the same with this method as we did with getName()



    //this method will execute when we pic an item from the spinner
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        //Setting the values to textviews for a selected item
        //textViewName.setText(getName(position));
        //textViewCourse.setText(getCourse(position));
        //textViewSession.setText(getSession(position));
    }

    //When no item is selected this method would execute
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
       // textViewName.setText("");
      //  textViewCourse.setText("");
        //textViewSession.setText("");
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    }
}

C'est le fichier congig.java:

public class Config {
    //JSON URL
    public static final String DATA_URL = "http://..../get_country.php";


    //JSON array name
    public static final String JSON_ARRAY = "result";
}

Voici mon json:

[
  {
    "id": "1",
    "country": "UAE"
  },
  {
    "id": "2",
    "country": "UK"
  },
  {
    "id": "3",
    "country": "SAUDI ARABIA"
  },
  {
    "id": "4",
    "country": "OMAN"
  },
  {
    "id": "5",
    "country": "BAHRAIN"
  }
]

Je n'obtiens aucune erreur dans logcat ... je ne sais pas pourquoi il ne s'affiche pas ??

1
user7289557 24 janv. 2017 à 08:12

5 réponses

Meilleure réponse

Selon votre JSON attaché, votre tableau JSON n'a aucun nom et vous essayez d'analyser comme

result = j.getJSONArray(Config.JSON_ARRAY); // Config.JSON_ARRAY = "results";

Votre analyse semble incorrecte.

Vous devez analyser le tableau JSON comme ceci -

JSONArray result = new JSONArray(response);

Supprimer également

j = new JSONObject(response);
1
Rahul 24 janv. 2017 à 07:50

Tout d'abord, vous devez vérifier si le json est correctement analysé. Pour cela, placez un Log dans la boucle for où vous obtenez le code et le nom du pays.

Si le JSON que vous avez publié est le même que celui que vous avez obtenu de Log.d("Test",response);, vous devez changer
De:

j = new JSONObject(response);
 //Storing the Array of JSON String to our JSON Array 
result = j.getJSONArray(Config.JSON_ARRAY);`

À: result = new JSONArray(response);

Ou bien, si la réponse est comme {result:[...]}, alors vous avez raison, vous obtiendrez le json analysé.

Ensuite, si vous avez les valeurs correctes dans le journal de la boucle for, le problème vient de votre adaptateur. Pour simplifier, utilisez un adaptateur personnalisé étendant le BaseAdapter au lieu de ArrayAdapter.

0
Nizam 24 janv. 2017 à 07:22

Salut pouvez-vous essayer comme ça

for (int i = 0; i < jsonArrayCountry.length(); i++) {
           countries_object = jsonArrayCountry.getJSONObject(i);
           country_code = countries_object.getString("id");
           country_name = countries_object.getString("country");
           countries.add(new Country(country_code, country_name));
         }
ArrayAdapter countryAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, countries);
countrySpinner.setAdapter(countryAdapter);
0
Rahul 24 janv. 2017 à 05:43

Ajouter

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

Avant setAdapter

0
Sangeet Suresh 24 janv. 2017 à 07:35

Lorsque vous travaillez avec l'API La première étape consiste à vérifier si l'API fonctionne correctement ou non à cette fin, vous pouvez utiliser REST_CLIENT et POSTMAN Chekc - https://chrome.google.com/webstore/detail/ postman / fhbjgbiflinjbdggehcddcbncdddomop? hl = fr

Mettez votre URL, l'en-tête que vous voulez que de vérifier si la réponse est parfaite ou non
Si la réponse est correcte, vous pouvez passer du côté Android

Je vous suggère d'utiliser Gson Liabrary pour analyser gson - https://stackoverflow.com/a/41616005/4741746

Et vous obtiendrez directement ArrayList que vous devez définir pour Spinner

enter image description here

Dans la section Réponse, vous obtiendrez votre json, puis sur Android, l'analysez à l'aide de Gson Lib BEST OF LUCK

Mettre ces dépendances dans le fichier app build.gradle

dependencies {
  compile 'com.google.code.gson:gson:2.6.2'
} 




public class Responce implements Serializable {

    @SerializedName("result")
    public ArrayList<Data>  result;

    public class Data implements Serializable {

     /*{
       "id": "1",
       "country": "UAE"
     },*/
    @SerializedName("country")
    public String  country;

    @SerializedName("id")
    public String  id;
    }
} 

Modifiez légèrement votre réponse, c'est la bonne façon de procéder

{
    "result": [
        {
            "id": "1",
            "country": "UAE"
        },
        {
            "id": "2",
            "country": "UK"
        },
        {
            "id": "3",
            "country": "SAUDI ARABIA"
        },
        {
            "id": "4",
            "country": "OMAN"
        },
        {
            "id": "5",
            "country": "BAHRAIN"
        }
    ]
}

Et maintenant vous pouvez y accéder comme

             @Override
                public void onResponse(String response) {


                  Gson gson = new GsonBuilder().create();
                  Responce movie = gson.fromJson(response, Responce.class);
                  ArrayList<Data>  mCountryList=movie.result;

                }
            } 

Deuxième voie mais pas la bonne manière

@Override
   public void onResponse(String response) {


    try {
                    ArrayList<String> mStrings = new ArrayList<>();
                    JSONArray myArray = new JSONArray(response);
                    for(int i=0 ;i< myArray.length();i++){
                        JSONObject mObject = (JSONObject) myArray.get(i);
                        String id=  mObject.getString("id");
                        String country=  mObject.getString("country");
                        mStrings.add(country);
                    }
                    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, mStrings); //selected item will look like a spinner set from XML
                    spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinner.setAdapter(spinnerArrayAdapter);
                }catch (Exception e){

                }
      }
  } 
0
Community 23 mai 2017 à 12:33