问题
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!
回答1:
Well, in simplest case when you want to support API < 11 and use PreferenceActivity
this is how you can populate your ListPreference
with data read from JSON Object:
MainActivity.java
package com.example.abc;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.util.Log;
public class MainActivity extends PreferenceActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
ArrayList<String> entries = new ArrayList<>();
ArrayList<String> entryValues = new ArrayList<>();
String jsonString = "{\"city\":[{\"id\":\"1\",\"name\":\"London\"},{\"id\":\"2\",\"name\":\"Berlin\"},{\"id\":\"3\",\"name\":\"New York\"}],\"success\":1}";
try {
JSONObject json = new JSONObject(jsonString);
JSONArray jsonArray = json.getJSONArray("city");
for(int i = 0; i < jsonArray.length(); ++i) {
JSONObject cityObject = (JSONObject) jsonArray.get(i);
entryValues.add(cityObject.getString("id"));
entries.add(cityObject.getString("name"));
}
} catch (JSONException e) {
Log.i(TAG ,"Improper JSON string");
}
ListPreference listPreference = (ListPreference) findPreference("CityList");
listPreference.setEntries(entries.toArray(new String[entries.size()]));
listPreference.setEntryValues(entryValues.toArray(new String[entryValues.size()]));
}
}
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference
android:key="CityList"
android:title="Cities" />
</PreferenceScreen>
回答2:
Check info about findPreference
method deprecation here findPreference.
If you're using API lower then 11 you have to stick to PreferenceActivity (and findPreference
deprecated method) or implement custom PreferenceFragment PreferenceFragment. Otherwise use PreferenceFragment API. To set values which are displayed in your ListPreference use setEntries
and setEntryValues
methods of ListPreference
class.
回答3:
public static void callWebService() {
try {
// make web service connection
HttpPost request = new HttpPost(
"http://ptk.com/mobile/Service.svc/PostComments");
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
// Build JSON string
JSONStringer TestApp = new JSONStringer().object()
.key("NewsItemId").value("1").key("Comments")
.value("manish").key("FullName").value("androidhub")
.key("Location").value("india").key("Email")
.value("android@gmail.com").key("Type")
.value("News").endObject();
StringEntity entity = new StringEntity(TestApp.toString());
Log.d("****Parameter Input****", "Webservice Testing:" + TestApp);
request.setEntity(entity);
// Send request to WCF service
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(request);
Log.d("WebInvoke", "Saving: " + response.getStatusLine().toString());
// Get the status of web service
BufferedReader rd = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
// print status in log
String line = "";
while ((line = rd.readLine()) != null) {
Log.d("****Status Line***", "Webservice Response: " + line);
}
} catch (Exception e) {
e.printStackTrace();
Log.d("****Status Line***",
"Webservice Exception: " + e.getMessage());
}
}
来源:https://stackoverflow.com/questions/27272583/loading-json-data-to-android-listpreference