Creating Layout:
The Main layout for our project is “activity_main” which has a ListView to display the array.
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" android:paddingBottom = "@dimen/activity_vertical_margin" android:paddingLeft = "@dimen/activity_horizontal_margin" android:paddingRight = "@dimen/activity_horizontal_margin" android:paddingTop = "@dimen/activity_vertical_margin" tools:context = ".MainActivity" > < ListView android:id = "@+id/list" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:layout_above = "@+id/getdata" /> < Button android:id = "@+id/getdata" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentBottom = "true" android:layout_centerHorizontal = "true" android:layout_marginBottom = "23dp" android:text = "Get Data" /> </ RelativeLayout > |
Next step is to create a layout for the list item that is to be displayed in ListView. Create the layout as list_v.xml which has three TextView’s to display the Array in each list item. Here I have created the TextView’s in LinearLayout.
list_v.xml
<!-- android help -->
<ins class="adsbygoogle"
style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-1495591458562636"
data-ad-slot="2543043308"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" > < TextView android:id = "@+id/vers" android:layout_width = "match_parent" android:layout_height = "wrap_content" /> < TextView android:id = "@+id/name" android:layout_width = "match_parent" android:layout_height = "wrap_content" /> < TextView android:id = "@+id/api" android:layout_width = "match_parent" android:layout_height = "wrap_content" /> </ LinearLayout > |
Creating Activity:
Before creating the MainActivity we need to create a JSON Parser class which gets the JSON data from the URL and returns JSON Object.
In your Project create a new folder library in the src folder such that the package is “learn2crack.listview.library”. Create the JSONParser.java in the library folder.
In your Project create a new folder library in the src folder such that the package is “learn2crack.listview.library”. Create the JSONParser.java in the library folder.
JSONParser.java
package smr.listview.library; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; 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 JSONParser { static InputStream is = null ; static JSONObject jObj = null ; static String json = "" ; // constructor public JSONParser() { } public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 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(); json = sb.toString(); } catch (Exception e) { Log.e( "Buffer Error" , "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e( "JSON Parser" , "Error parsing data " + e.toString()); } // return JSON String return jObj; } } |
Next step is to create MainActivity.The Button “Get Data” is used to trigger the AsyncTask which process the backgroung Data. Here we are defining the array “oslist” which is displayed as text in ListView. The JSONArray is “android” which we got from the URL. It is then stored in a string. We are using ListAdapter is generate ListView. Finally we are using OnItemClickListener to display the OS in Toast when it is clicked.
MainActivity.java
package learn2crack.listview; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import learn2crack.listview.library.JSONParser; public class MainActivity extends Activity { ListView list; TextView ver; TextView name; TextView api; Button Btngetdata; ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>(); //URL to get JSON Array private static String url = "http://api.learn2crack.com/android/jsonos/" ; //JSON Node Names private static final String TAG_OS = "android" ; private static final String TAG_VER = "ver" ; private static final String TAG_NAME = "name" ; private static final String TAG_API = "api" ; JSONArray android = null ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); oslist = new ArrayList<HashMap<String, String>>(); Btngetdata = (Button)findViewById(R.id.getdata); Btngetdata.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { new JSONParse().execute(); } }); } private class JSONParse extends AsyncTask<String, String, JSONObject> { private ProgressDialog pDialog; @Override protected void onPreExecute() { super .onPreExecute(); ver = (TextView)findViewById(R.id.vers); name = (TextView)findViewById(R.id.name); api = (TextView)findViewById(R.id.api); pDialog = new ProgressDialog(MainActivity. this ); pDialog.setMessage( "Getting Data ..." ); pDialog.setIndeterminate( false ); pDialog.setCancelable( true ); pDialog.show(); } @Override protected JSONObject doInBackground(String... args) { JSONParser jParser = new JSONParser(); // Getting JSON from URL JSONObject json = jParser.getJSONFromUrl(url); return json; } @Override protected void onPostExecute(JSONObject json) { pDialog.dismiss(); try { // Getting JSON Array from URL android = json.getJSONArray(TAG_OS); for ( int i = 0 ; i < android.length(); i++){ JSONObject c = android.getJSONObject(i); // Storing JSON item in a Variable String ver = c.getString(TAG_VER); String name = c.getString(TAG_NAME); String api = c.getString(TAG_API); // Adding value HashMap key => value HashMap<String, String> map = new HashMap<String, String>(); map.put(TAG_VER, ver); map.put(TAG_NAME, name); map.put(TAG_API, api); oslist.add(map); list=(ListView)findViewById(R.id.list); ListAdapter adapter = new SimpleAdapter(MainActivity. this , oslist, R.layout.list_v, new String[] { TAG_VER,TAG_NAME, TAG_API }, new int [] { R.id.vers,R.id.name, R.id.api}); list.setAdapter(adapter); list.setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity. this , "You Clicked at " +oslist.get(+position).get( "name" ), Toast.LENGTH_SHORT).show(); } }); } } catch (JSONException e) { e.printStackTrace(); } } } } |
Creating Manifest:
Add the permision “android.permission.INTERNET” to the Manifest file as we need to access external Address.No other special Permissions are required for our project.
AndroidManifest.xml
<? xml version = "1.0" encoding = "utf-8" ?> < manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "learn2crack.listview" android:versionCode = "1" android:versionName = "1.0" > < uses-sdk android:minSdkVersion = "8" android:targetSdkVersion = "19" /> < application android:allowBackup = "true" android:icon = "@drawable/ic_launcher" android:label = "@string/app_name" android:theme = "@style/AppTheme" > < activity android:name = "learn2crack.listview.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 > < uses-permission android:name = "android.permission.INTERNET" /> </ manifest > |
Finally run the project in the Emulator.