I have a problem.I have read many forums and topics but I can not understand how to create a class file to load JSON data like:
{"city":[{"id":"1","name":"London"},{"id":"2","name":"Berlin"},{"id":"3","name":"New York"}],"success":1}
to an ListPreference list for saving one value to shared preference file. Like my saved url:
<string name="URL">192.168.1.100/data</string>
without deprecated methods (findPreference("city")
).
The preference xml which I use is
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="@string/settings_menu" >
<ListPreference
android:defaultValue="192.168.1.100/data"
android:entries="@array/URLArray"
android:entryValues="@array/URLValues"
android:key="URL"
android:summary="@string/filter_for_searches"
android:title="@string/your_country" />
<ListPreference
android:defaultValue=""
android:entries="@array/listArray"
android:entryValues="@array/listValues"
android:key="city"
android:title="@string/your_city"/>
<ListPreference
android:defaultValue=""
android:entries="@array/listLang"
android:entryValues="@array/listLangValues"
android:key="Language"
android:summary=""
android:title="@string/select_your_language" />
</PreferenceCategory>
</PreferenceScreen>
and my source code
package com.sono.famlocator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
public class CityLoader extends ListActivity {
A cls2= new A();
JSONArray city;
JSONObject jsonobject;
PrefAdapter adapter;
private ProgressDialog pDialog;
private String loader;
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> cList;
public static String url2;
public static String country;
static final String TAG_SUCCESS = "success";
static final String TAG_EVENTS = "city";
static final String TAG_ID = "id";
static final String TAG_NAME = "name";
static final String TAG_LOADER = "TAG_LOADER";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_f_all);
cls2.url(this);
cls2.country(this);
country = A.country;
url2 = A.url2;
loader = "http://" + url2 + "/get_citylist.php";
String title = getResources().getString(R.string.app_name);
setTitle(title + " - Country");
cList = new ArrayList<HashMap<String, String>>();
new LoadCity().execute();
}
public boolean isOnline() {
Context context = getApplicationContext();
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.isConnected())
return true;
else
return false;
}
public class LoadCity extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(CityLoader.this);
pDialog.setMessage("Loading. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
/**
* getting All city from url
* */
protected String doInBackground(String... args) {
if (isOnline()) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("country", country));
JSONObject json = jParser.makeHttpRequest(loader, "GET", params);
Log.d("All Events: ", json.toString());
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
city = json.getJSONArray(TAG_EVENTS);
for (int i = 0; i < city.length(); i++) {
jsonobject = city.getJSONObject(i);
//key for adapter
String key = "CITY";
String id = jsonobject.getString(TAG_ID);
String name = jsonobject.getString(TAG_NAME);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_LOADER, key);
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
cList.add(map);
}
} else {
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
protected void onPostExecute(final String file_url) {
pDialog.dismiss();
ListView lv = getListView();
adapter = new PrefAdapter(CityLoader.this, cList);
lv.setAdapter(adapter);
}
}
}
Thanks in advance and sorry for my bad English!
Well, in simplest case when you want to support API < 11 and use
PreferenceActivity
this is how you can populate yourListPreference
with data read from JSON Object:MainActivity.java
preferences.xml
Check info about
findPreference
method deprecation here findPreference. If you're using API lower then 11 you have to stick to PreferenceActivity (andfindPreference
deprecated method) or implement custom PreferenceFragment PreferenceFragment. Otherwise use PreferenceFragment API. To set values which are displayed in your ListPreference usesetEntries
andsetEntryValues
methods ofListPreference
class.