Search code examples
javaandroidarraysjsonretrofit

How to convert JsonArray object to Array of string to be used on spinner java android?


enter image description here I have created an API, (check the picture) and i need to get sumber[] from api and store it to my spinner. But i got error:

is there any best practice way to cast the jsonArray object to my spinner?

java.lang.ArrayStoreException: source[0] of type Item_sumber cannot be stored in destination array of type java.lang.String[]

Activity_addcontact.java

    private ArrayList Arraylist_sumber, Arraylist_budget;
    ....
          Call<Formdata> call = jsonPlaceHolderApi.getFormdata();
          call.enqueue(new Callback<Formdata>() {
               @Override
          public void onResponse(Call<Formdata> call, Response<Formdata> response) {
            
          Formdata jsonResponse = response.body();

          String[] string_sumber = Arrays.copyOf(jsonResponse.getSumber(), jsonResponse.getSumber().length,String[].class);
          ArrayAdapter<String> adapter_sumber = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_spinner_dropdown_item, string_sumber);
          dropdown_sumber.setAdapter(adapter_sumber);
          dropdown_sumber.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
         public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                id_sumber = String.valueOf(i + 1);
         }
            
         

Item_sumber

    private String id;
    private String nama_sumber;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getNama_sumber() {
        return nama_sumber;
    }
    public void setNama_sumber(String nama_sumber) {
        this.nama_sumber = nama_sumber;
    }

Formdata.java

public class Formdata {
    private Item_sumber[] sumber;
    private Item_budget[] budget;

    public Item_sumber[] getSumber() {
        return sumber;
    }
    public void setSumber(Item_sumber[] sumber) {
        this.sumber = sumber;
    }
    public Item_budget[] getBudget() {
        return budget;
    }
    public void setBudget(Item_budget[] budget) {
        this.budget = budget;
    }
}

Solution

  • My friend helped me, and I've solved it.

    1. Make and convert the jsonarray to Arraylist (object)

    2. Make Iteration so you can store it to Array of String[]

    3. Done! now cast it to your spinner

           Call<Formdata> call = jsonPlaceHolderApi.getFormdata();
       call.enqueue(new Callback<Formdata>() {
       @Override
        public void onResponse(Call<Formdata> call, Response<Formdata> response) {
      
        Formdata jsonResponse = response.body();
      
        ArrayList<Item_sumber> arraylist_sumber = new ArrayList<>(Arrays.asList(jsonResponse.getSumber()));
      
        ArrayList<String> list_sumber = new ArrayList<>();
        for (int i = 0; i < jsonResponse.getSumber().length; i++) {
            Item_sumber item_sumber = arraylist_sumber.get(i);
            list_sumber.add(item_sumber.getId());
        }
      
        string_sumber = new String[arraylist_sumber.size()];
      
      
        /* If 2 dimensional array convert
        private String[][] string_sumber2, string_budget2;
        string_sumber2 = new String[arraylist_sumber.size()][6];
        for (int i = 0; i < jsonResponse.getSumber().length; i++) {
            Item_sumber data = arraylist_sumber.get(i);
            string_sumber2[i] = new String[]{data.getId(),data.getNama_sumber()};
                       }*/
      
        for (int i = 0; i < jsonResponse.getSumber().length; i++) {
            Item_sumber data = arraylist_sumber.get(i);
            string_sumber[i] = data.getNama_sumber();
            }
      
        ArrayAdapter<String> adapter_sumber = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_spinner_dropdown_item, string_sumber);
                       dropdown_sumber.setAdapter(adapter_sumber);
                       dropdown_sumber.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
      
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        id_sumber = String.valueOf(i + 1);
        }
      
         @Override
         public void onNothingSelected(AdapterView<?> adapterView) {
         }
         });
      
      
         @Override
         public void onFailure(Call<Formdata> call, Throwable t) {
           call.cancel();
        }
       });