簡體   English   中英

Android將JSONARRAY轉換為數組

[英]Android CONVERT JSONARRAY TO ARRAYLIST

我有AsyncConector類來解析JSON信息,在doInBackground方法中,我已經獲得了有關JSON數據的正確信息...

[{"suc_nombre":"Cuautitlán","cli_nombre":"Futcho 7"}]

那么如何將這些信息放入標准適配器中? ....

lvAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>());

在doInBackground方法中,我有此代碼,但不起作用

data = new JSONToStringCollection(obj).getArrayList();

完整的課..

    public class AsyncConector extends AsyncTask<Void, Void, Void> {
    private ArrayList<String> data;
    private ArrayAdapter<String> adapter;
    private String url;
    private String tag; //// JSON Node names
    private ProgressDialog pd;
    private Context context;
    List<NameValuePair> parametros;
    // data JSONArray
    JSONArray ljsonArray = null;

    public AsyncConector(Context context, ArrayAdapter<String> adapter,
            String url, List<NameValuePair> params, String tag) {
        this.adapter = adapter;
        this.url = url;
        pd = new ProgressDialog(context);
        this.context = context;
        this.parametros = params;
        this.tag = tag;
    }

    @Override
    protected void onPreExecute() {
        // Configuramos el ProgressDialog para mostrar mensaje de que se está
        // cargando el contenido.
        pd.setIndeterminate(true);
        pd.setMessage(context.getResources().getString(R.string.MessageProgressDialog));
        pd.setTitle(R.string.TitleProgressDialog);
        // Mostramos el ProgressDialog.
        pd.show();
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Creamos un objeto de la clase que se encargará de conectar a la URL y analizar su contenido.
        ConectorHttpJSON conector = new ConectorHttpJSON(url, parametros);

        try {
            // Recogemos el documento JSON de Internet.
            JSONObject obj = conector.execute();

            // Getting JSON Array node
            ljsonArray = obj.getJSONArray(tag);


            // Analizamos el documento JSON y recogemos todos los datos
            data = new JSONToStringCollection(obj).getArrayList();

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // Añadimos todos los links al Adapter.
        for (String tmp : data) 
            adapter.add(tmp);

        // Indicamos al Adapter que ha cambiado su contenido, para que actualice
        // a su vez los datos mostrados en el ListView.
        adapter.notifyDataSetChanged();

        // Eliminamos el ProgressDialog.
        pd.dismiss();
        super.onPostExecute(result);
    }
}

數據類別

// Creamos un Adapter estándar de Android.
            lvAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, new ArrayList<String>());
            // Actualizamos los datos, pasamos el Context para poder mostrar un
            // ProgressDialog durante la carga de datos y el Adapter para
            // actualizarlo, url y parametros
            ((BDApplication) getApplication()).getData(this, lvAdapter, url, params, tag);

我將介紹一種將有助於大型應用程序的方法。

在您的項目中創建一個包含所有JSON解析器的包。

從主線程(活動)調用AsyncTask

new AsyncConector().execute( /* Whatever parameters you want */);

調用解析器:

@Override
protected void onPostExecute(Void result) {
    ArrayList<Car> cars = new CarParser(jsonString).getBeans();

    // add values to your adapter and notify dataset changed. add objects to the adapter
    // loop is fine.
}

資料類別:

public class Car {

    private String suc_nombre;
    private String cli_nombre;

    public String getSuc_nombre() {
        return suc_nombre;
    }

    public void setSuc_nombre(String suc_nombre) {
        this.suc_nombre = suc_nombre;
    }

    public String getCli_nombre() {
        return cli_nombre;
    }

    public void setCli_nombre(String cli_nombre) {
        this.cli_nombre = cli_nombre;
    }
}

樣本解析類文件:

public class CarParser {

    private ArrayList<Car> beans = new ArrayList<Car>();

    public CarParser(String json) {
        try {
            JSONArray array = new JSONArray(json);
            for (int i=0;i<array.length();i++) {
                JSONObject object = array.getJSONObject(i); 
                Car car = new Car();
                car.setSuc_nombre(object.getString("suc_nombre"));
                car.setCli_nombre(object.getString("cli_nombre"));
                beans.add(car);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        String beansString = "";
        for (int i=0;i<getBeans().size();i++) {
            beansString += "\n-------\n" + getBeans().get(i).toString();
        }
        return "CarParser [beans=" + beansString + "]";
    }

    public ArrayList<Car> getBeans() {
        return beans;
    }

    public void setBeans(ArrayList<Car> beans) {
        this.beans = beans;
    }
}

如果僅將JSONArray轉換為ArrayList以便與ArrayAdapter一起使用,也許我可以推薦另一種方法。 只需使用直接支持JSONArrays的適配器即可。 Advanced-Adapters庫支持此類適配器。

就像ArrayAdapter一樣,除了它是用JSONArray而不是ArrayList構造的。 但是,與ArrayAdapter不同,它需要您在getView()方法中編寫視圖創建邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM