Loading JSON data to android listpreference

2019-05-26 11:31发布

问题:

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());
    }

}