Surbhi Panchal
Surbhi Panchal

Reputation: 29

populate json array in android spinner

I am getting problem to parse json in android spinner. I have tried by below listed code but I am getting full json array in spinner like screenshot

click to see result

My Json Array

{"Department":[{"1":"Computer"},{"2":"IT"},{"3":"Civil"}]} // like this type json string

My Code

public class GetDropdownItems extends AsyncTask<Void, Void, String[]> {
        public GetDropdownItems() {
            super();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.i("MY_NETWORK", "first");
        }

        @Override
        protected String[] doInBackground(Void... params) {
            StringBuilder sbstaffdep = new StringBuilder();
            String staffdepURL = StaticDataEntity.URL_GETDEP;
            String charset = "UTF-8";  // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name()
            URLConnection connectionstaffDep = null;
            try {
                connectionstaffDep = new URL(staffdepURL).openConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }

            connectionstaffDep.setDoOutput(true); // Triggers POST.
            connectionstaffDep.setRequestProperty("Accept-Charset", charset);
            connectionstaffDep.setConnectTimeout(6000);

            InputStream responsestaffDep = null;
            try {
                responsestaffDep = connectionstaffDep.getInputStream();
            } catch (IOException e) {
                e.printStackTrace
                        ();
                return new String[]{"unreachable"};

            }

            BufferedReader brstaffDep = new BufferedReader(new InputStreamReader(responsestaffDep));
            String readstaffDep;
            try {

                while ((readstaffDep = brstaffDep.readLine()) != null) {
                    //System.out.println(read);
                    sbstaffdep.append(readstaffDep);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {

                brstaffDep.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            String[] finaldata = new String[1];
            finaldata[0] = sbstaffdep.toString();
            return finaldata;
        }

        @Override
        protected void onPostExecute(String[] s) {
            super.onPostExecute(s);

            if (s[0].equals("unreachable")) {
                new SweetAlertDialog(SignUpStaff.this, SweetAlertDialog.ERROR_TYPE)
                        .setTitleText("Oops...")
                        .setContentText("Unable to connect to server ! \n Please try again later.")
                        .setCancelText("Ok")
                        .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                            @Override
                            public void onClick(SweetAlertDialog sweetAlertDialog) {
                                sweetAlertDialog.cancel();
                            }
                        })
                        .show();
                return;
            }
            Log.i("MY_NETWORK", s.toString());
            String[] dataofdropdowndep = s[0].split(",");
            ArrayAdapter<String> adapterdep = new ArrayAdapter<String>(SignUpStaff.this, android.R.layout.simple_list_item_1, dataofdropdowndep);
            adapterdep.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            dropstaffdep.setAdapter(adapterdep);
        }
    }

Upvotes: 2

Views: 1260

Answers (4)

Omar
Omar

Reputation: 458

The way you are fetching the Json file is wrong, there is already Json classes that can easly get each array,object or key alone.

org.json is the library we are going to use with the JSONArray and JSONObject classes.

Before we start you should know a basic understanding of the Json file scheme :

"name":{} this is the array syntax represented by the {} symbols, this array can hold arrays,objects or keys.

[] represent and object which can hold arrays and keys too but it doesn't have name.

"key":"value" now the is key type which can hold the data or values you want and has a key to retrieve it by name.

Now here is a piece of code to fetch your file and get each part of the Json file alone and then you can populate it as you wish.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.res.Resources;

public class Fetch {

    final private static String DEPARTMENT = "Department";
    String [] departments ;


    public void fetch(Resources r , int resourceID) {
        String JsonString = readStringFromRaw(r, resourceID);
        //the whole josn file is a json object even if it starts with { and ends with } so...
        try {

            JSONObject mainObject = new JSONObject(JsonString);
            // the JSONObject throws a JSONException if there is something wrong with the syntax
            JSONArray department = mainObject.getJSONArray(DEPARTMENT);

            int length = department.length();

            departments = new String[length];

            JSONObject object;
            for(int i = 0 ; i < length ; i++){
            object = department.getJSONObject(i);
            departments[0] = object.getString(""+i+1);
            //this because you tagged the keys with 1 , 2 , 3 and so on.. so it has the value of the object that it is in + 1 . 
            //the reason I put "" empty quotations is because I want it a string so this is a way to cast the numbers to strings .

            }


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

    }

    public static String readStringFromRaw(Resources r, int resourceID) {
        InputStream is = r.openRawResource(resourceID);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder(1000);
        String line;
        try {
            while ((line = br.readLine()) != null)
                sb.append(line);
            br.close();
            is.close();
            return sb.toString();
        } catch (IOException e) {
            return e.getMessage();
        }
    }
}

With this class you can get a String array holding the departments you want for your json file that you have.

The heirarchy between arrays and objects is very important so keep in mind that when you write a json file make it less complicated to extract the information easier.

Upvotes: 0

Md Maidul Islam
Md Maidul Islam

Reputation: 2304

HI Change your Json Response from server or you can change manually .

Here is your format :

{"Department"
 [
  {
   "1": "Computer"
  },
  {
   "2": "IT"
  },
  {
   "3": "Civil"
  }
 ]
}

Please check it with any json viewer format online.

Upvotes: 1

Surya Prakash Kushawah
Surya Prakash Kushawah

Reputation: 3201

public class GetDropdownItems extends AsyncTask<Void, Void, String> {
        public GetDropdownItems() {
            super();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.i("MY_NETWORK", "first");
        }

        @Override
        protected String doInBackground(Void... params) {
            StringBuilder sbstaffdep = new StringBuilder();
            String staffdepURL = StaticDataEntity.URL_GETDEP;
            String charset = "UTF-8";  // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name()
            URLConnection connectionstaffDep = null;
            try {
                connectionstaffDep = new URL(staffdepURL).openConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }

            connectionstaffDep.setDoOutput(true); // Triggers POST.
            connectionstaffDep.setRequestProperty("Accept-Charset", charset);
            connectionstaffDep.setConnectTimeout(6000);

            InputStream responsestaffDep = null;
            try {
                responsestaffDep = connectionstaffDep.getInputStream();
            } catch (IOException e) {
                e.printStackTrace
                        ();
                return "unreachable";

            }
try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    responsestaffDep, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();

            Log.d("-------------", json);
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }


            return json;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            if (s.equals("unreachable")) {
                new SweetAlertDialog(SignUpStaff.this, SweetAlertDialog.ERROR_TYPE)
                        .setTitleText("Oops...")
                        .setContentText("Unable to connect to server ! \n Please try again later.")
                        .setCancelText("Ok")
                        .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                            @Override
                            public void onClick(SweetAlertDialog sweetAlertDialog) {
                                sweetAlertDialog.cancel();
                            }
                        })
                        .show();
                return;
            }
            Log.i("MY_NETWORK", s.toString());
            Json js=new Json(s);
JSONArray array=js.getJSONArray("Department");
for(JSONArray b:array){
// traverse array here
}
            ArrayAdapter<String> adapterdep = new ArrayAdapter<String>(SignUpStaff.this, android.R.layout.simple_list_item_1, dataofdropdowndep);
            adapterdep.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            dropstaffdep.setAdapter(adapterdep);
        }
    }

Upvotes: 1

Damini Mehra
Damini Mehra

Reputation: 3347

this type json data: check this json array:

{
    "schools": [{
        "Name": "Hill View Elementary",
        "SchoolID": "HVE"
    }, {
        "Name": "Mill View",
        "SchoolID": "MVE"
    }, {
        "Name": "Big School",
        "SchoolID": "BSC"
    }]
}

your mistake is you are not putting comma between two objects

Upvotes: 0

Related Questions