Android Populating Spinner With JSON Tutorial
Last Updated: November 18, 2013
In this tutorial, you will learn how to populate a spinner with data remotely using a JSON file in your Android application. A spinner displays a dropdown menu with available values, from which the user can select or navigate. We will create a spinner on the main view and populate it with data remotely using a JSON file and on spinner click will show a selectable dropdown menu. On selected dropdown menu will show the selected results below the spinner. So lets begin…
Create a new project in Eclipse File > New > Android Application Project. Fill in the details and name your project JSONSpinnerTutorial.
Application Name : JSONSpinnerTutorial
Project Name : JSONSpinnerTutorial
Package Name : com.androidbegin.jsonspinnertutorial
Open your MainActivity.java and paste the following code.
MainActivity.java
package com.androidbegin.jsonspinnertutorial; import java.util.ArrayList; import org.json.JSONArray; import org.json.JSONObject; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.app.ProgressDialog; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; public class MainActivity extends Activity { JSONObject jsonobject; JSONArray jsonarray; ProgressDialog mProgressDialog; ArrayList<String> worldlist; ArrayList<WorldPopulation> world; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Download JSON file AsyncTask new DownloadJSON().execute(); } // Download JSON file AsyncTask private class DownloadJSON extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // Locate the WorldPopulation Class world = new ArrayList<WorldPopulation>(); // Create an array to populate the spinner worldlist = new ArrayList<String>(); // JSON file URL address jsonobject = JSONfunctions .getJSONfromURL("https://www.androidbegin.com/tutorial/jsonparsetutorial.txt"); try { // Locate the NodeList name jsonarray = jsonobject.getJSONArray("worldpopulation"); for (int i = 0; i < jsonarray.length(); i++) { jsonobject = jsonarray.getJSONObject(i); WorldPopulation worldpop = new WorldPopulation(); worldpop.setRank(jsonobject.optString("rank")); worldpop.setCountry(jsonobject.optString("country")); worldpop.setPopulation(jsonobject.optString("population")); worldpop.setFlag(jsonobject.optString("flag")); world.add(worldpop); // Populate spinner with country names worldlist.add(jsonobject.optString("country")); } } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void args) { // Locate the spinner in activity_main.xml Spinner mySpinner = (Spinner) findViewById(R.id.my_spinner); // Spinner adapter mySpinner .setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, worldlist)); // Spinner on item click listener mySpinner .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub // Locate the textviews in activity_main.xml TextView txtrank = (TextView) findViewById(R.id.rank); TextView txtcountry = (TextView) findViewById(R.id.country); TextView txtpopulation = (TextView) findViewById(R.id.population); // Set the text followed by the position txtrank.setText("Rank : " + world.get(position).getRank()); txtcountry.setText("Country : " + world.get(position).getCountry()); txtpopulation.setText("Population : " + world.get(position).getPopulation()); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } } }
In this activity, we have hosted a JSON file in our server and used the JSON functions to retrieve the JSON array and objects from the URL address. We have created an AsyncTask as a background task to load the JSON objects into a string array. Then we populated the spinner with the selected JSON data and on spinner dropdown item click will show the selected data on the textviews.
JSON File Link : https://www.androidbegin.com/tutorial/jsonparsetutorial.txt
Output:
{ // JSON Object "worldpopulation": // JSON Array Name [ // JSON Array { // JSON Object "rank":1,"country":"China", "population":"1,354,040,000", "flag":"https://www.androidbegin.com/tutorial/flag/china.png" }, { // JSON Object "rank":2,"country":"India", "population":"1,210,193,422", "flag":"https://www.androidbegin.com/tutorial/flag/india.png" }, { // JSON Object "rank":3,"country":"United States", "population":"315,761,000", "flag":"https://www.androidbegin.com/tutorial/flag/unitedstates.png" }, { // JSON Object "rank":4,"country":"Indonesia", "population":"237,641,326", "flag":"https://www.androidbegin.com/tutorial/flag/indonesia.png" }, { // JSON Object "rank":5,"country":"Brazil", "population":"193,946,886", "flag":"https://www.androidbegin.com/tutorial/flag/brazil.png" }, { // JSON Object "rank":6,"country":"Pakistan", "population":"182,912,000", "flag":"https://www.androidbegin.com/tutorial/flag/pakistan.png" }, { // JSON Object "rank":7,"country":"Nigeria", "population":"170,901,000", "flag":"https://www.androidbegin.com/tutorial/flag/nigeria.png" }, { // JSON Object "rank":8,"country":"Bangladesh", "population":"152,518,015", "flag":"https://www.androidbegin.com/tutorial/flag/bangladesh.png" }, { // JSON Object "rank":9,"country":"Russia", "population":"143,369,806", "flag":"https://www.androidbegin.com/tutorial/flag/russia.png" }, { // JSON Object "rank":10,"country":"Japan", "population":"127,360,000", "flag":"https://www.androidbegin.com/tutorial/flag/japan.png" } ] // JSON Array } // JSON Object
Next, create an JSON functions class. Go to File > New > Class and name it JSONfunctions.java. Select your package named com.androidbegin.jsonspinnertutorial and click Finish.
Open your JSONfunctions.java and paste the following code.
JSONfunctions.java
package com.androidbegin.jsonspinnertutorial; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; public class JSONfunctions { public static JSONObject getJSONfromURL(String url) { InputStream is = null; String result = ""; JSONObject jArray = null; // Download JSON data from URL try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error in http connection " + e.toString()); } // Convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result = sb.toString(); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); } try { jArray = new JSONObject(result); } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } return jArray; } }
Next, create an XML graphical layout for the MainActivity. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file activity_main.xml and paste the following code.
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Spinner android:id="@+id/my_spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/rank" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/my_spinner" /> <TextView android:id="@+id/country" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/rank" /> <TextView android:id="@+id/population" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/country" /> </RelativeLayout>
In your AndroidManifest.xml, we need to declare permissions to allow the application to connect to the Internet. Open your AndroidManifest.xml and paste the following code.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidbegin.jsonspinnertutorial" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Output:
Source Code
[purchase_link id=”8023″ text=”Purchase to Download Source Code” style=”button” color=”green”]
If you're using sdk 23 try adding this to your gradle (not under dependencies):android { useLibrary 'org.apache.http.legacy'}
gri fux
Android Populating Spinner With JSON Tutorial
import org.apache.http.HttpEntity; cannot find symbol HttpEntity. even every http import its seen in red and saying cannot find symbol.
Komal
Android Populating Spinner With JSON Tutorial
Create New class WorldPopulation public class WorldPopulation { private String rank; private String country; private String population; private String flag; public String getRank() { return rank; } public void setRank(String rank) { this.rank = rank; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getPopulation() { return population; } public void setPopulation(String population) { this.population = population; } public String getFlag() { return flag; } public void setFlag(String flag) { this.flag = flag; }}
Amir Amara
Android Populating Spinner With JSON Tutorial
it will never run without initializing , ArrayList worldlist; or ArrayList world,please initializing it, like that, worldlist= new ArrayList(); state = new ArrayList();
Arun Khanka
Android Populating Spinner With JSON Tutorial