将带有JSONObject的JSONArray显示在Android列表视图中

时间:2013-09-04 22:13:07

标签: android json listview android-listview jsonobject

我有这个带有jsonArray的jsonArray,它有一个jsonobject(alergenos),我想把它解析成一个android listview,但是当我尝试listview.setAdapter(JsonAdapter)时,我总是得到NullPointerException;

这是我的json回复:

{"valor":
    [{  
    "barcode":"8416400610992",
    "nombre":"Chicles Trident",
    "foto":"alood-52224273e4b90-foto1.jpg",
    "revision":{
       "date":"2013-08-31 21:22:27","timezone_type":3,"timezone":"Europe\/Paris"},
       "alergenos":[
           {"id":4,"alergeno":"Melocoton","valor":0},      
           {"id":3,"alergeno":"Cacahuetes","valor":1}
       ],
    "calorias":250,
    "puntos":0,
    "fabricante":"Sonia"
    }]
}

我正确得到了alergenos数据,如下所示:

JSONArray jArray = respJSON.getJSONArray("alergenos");

for (int n = 0; n < jArray.length(); n++) {
    JSONObject str_value = jArray.getJSONObject(n);
    String id = str_value.getString("id");
    String name = str_value.getString("alergeno");
    int value = str_value.getInt("valor");
}

AlergProdAdapter jSONAdapter = new AlergProdAdapter(Scan_Result.this, jArray);                  
listview.setAdapter(jSONAdapter);

这是我的适配器:

 class AlergProdAdapter extends BaseAdapter {

private final Activity activity;
private final JSONArray jsonArray;
final static ArrayList<AlergenosProducto> alergProd = new ArrayList<AlergenosProducto>();

AlergProdAdapter(Activity activity, JSONArray jsonArray) {
    assert activity != null;
    assert jsonArray != null;

    this.jsonArray = jsonArray;
    this.activity = activity;

    String name = null;
    int value = 0;
    String id = null;
    String image = null;

    for (int position = 0; position < jsonArray.length(); position++) {
        JSONObject json_data = getItem(position);

        if (null != json_data) {
            try {
                id = json_data.getString("id");
                Log.i("da", id);
                name = json_data.getString("alergeno");
                Log.i("da", name);
                value = json_data.getInt("valor");
                if(value == 1){
                    image = "imagenroja";
                }else{
                    image = "imagenverde";
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        AlergenosProducto alerg = new AlergenosProducto(id, name, value);
        alergProd.add(alerg);
    }

}

@Override
public int getCount() {
    if (null == jsonArray)
        return 0;
    else
        return jsonArray.length();
}

@Override
public JSONObject getItem(int position) {
    if (null == jsonArray)
        return null;
    else
        return jsonArray.optJSONObject(position);
}

@Override
public long getItemId(int position) {
    JSONObject jsonObject = getItem(position);

    return jsonObject.optLong("id");
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null)
        convertView = activity.getLayoutInflater().inflate(
                R.layout.allergy_listitems, null);

    TextView text = (TextView) convertView.findViewById(R.id.secondLine);

    text.setText(alergProd.get(position).getAlergeno());

    Log.i("value", alergProd.get(position).getAlergeno());

    return convertView;
}

有没有人知道如何解决这个问题?

谢谢!

编辑:

添加了log cat。

09-05 00:23:18.217: E/AndroidRuntime(26828): FATAL EXCEPTION: main
09-05 00:23:18.217: E/AndroidRuntime(26828): java.lang.NullPointerException
09-05 00:23:18.217: E/AndroidRuntime(26828):    at com.example.alood.Scan_Result$algResultados.onPostExecute(Scan_Result.java:230)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at com.example.alood.Scan_Result$algResultados.onPostExecute(Scan_Result.java:1)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at android.os.Looper.loop(Looper.java:137)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at android.app.ActivityThread.main(ActivityThread.java:4898)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at java.lang.reflect.Method.invokeNative(Native Method)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at java.lang.reflect.Method.invoke(Method.java:511)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
09-05 00:23:18.217: E/AndroidRuntime(26828):    at dalvik.system.NativeStart.main(Native Method)

编辑添加空洞asynctask:

 public class algResultados extends AsyncTask<Void, Void, String> {

    HttpResponse response;
    BufferedReader reader;
    StringBuilder builder;
    String barcode;

    public algResultados(String data) {
        super();
        this.barcode = data;
    }

    @Override
    protected String doInBackground(Void... arg0) {

        HttpClient httpClient = new DefaultHttpClient();

        String logusuario = SaveSharedPreference
                .getUserName(getApplicationContext());
        String logpass = SaveSharedPreference
                .getPassword(getApplicationContext());

        // Petition get
        HttpGet httpGet = new HttpGet("http://www.alood.es/api/resultado/"
                + barcode + '/');

        httpGet.addHeader(BasicScheme.authenticate(
                new UsernamePasswordCredentials(logusuario, logpass),
                "UTF-8", false));

        // Execute Get and get Response
        response = null;

        try {
            response = httpClient.execute(httpGet);

            reader = new BufferedReader(new InputStreamReader(response
                    .getEntity().getContent(), "UTF-8"));
            builder = new StringBuilder();
            for (String line = null; (line = reader.readLine()) != null;) {
                builder.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
            alert("Error de protocolo", "Lo sentimos, ha ocurrido un error");
        }

        // Return code (exit, fail, error, etc)
        return builder.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        String nombre = null;
        String fabricante = null;
        String barcode = null;
        String calorias = null;
        String fech = null;
        JSONArray jArray = null;

        Log.i("GET RESPONSE", "POSTTTTT");
        Log.i("GET RESPONSE", result);
        JSONTokener tokener = new JSONTokener(result);
        try {
            String cca = ((JSONObject) tokener.nextValue())
                    .getString("valor");

            Log.i("GET CCA", cca);

            JSONArray resparray = new JSONArray(cca);
            List<AlergenosProducto> objList = new ArrayList<AlergenosProducto>();

            for (int i = 0; i < resparray.length(); i++) {
                JSONObject respJSON = resparray.getJSONObject(i);

                nombre = respJSON.getString("nombre");
                fabricante = respJSON.getString("fabricante");
                String foto = respJSON.getString("foto");
                calorias = respJSON.getString("calorias");
                int puntos = respJSON.getInt("calorias");
                barcode = respJSON.getString("barcode");
                String fecha = respJSON.getJSONObject("revision").getString("date");
                fech = fecha.substring(0, 10);

                jArray = respJSON.getJSONArray("alergenos");

                for (int n = 0; n < jArray.length(); n++) {

                    JSONObject str_value = jArray.getJSONObject(n); 

                    String id = str_value.getString("id");
                    String name = str_value.getString("alergeno");
                    int value = str_value.getInt("valor");

                     Log.i("GET CCA", id);

                     AlergenosProducto setAlerg = new AlergenosProducto(id, name, value);
                     objList.add(setAlerg);
                }

            }

            TextView nombText = (TextView) findViewById(R.id.titleTxt);
            nombText.setText(nombre);

            TextView fabText = (TextView) findViewById(R.id.fabricanteTxt);
            fabText.setText("Fabricante: " + fabricante);

            TextView codText = (TextView) findViewById(R.id.codigoTxt);
            codText.setText("Código: " + barcode);

            TextView calText = (TextView) findViewById(R.id.caloriasTxt);
            calText.setText("Calorías: " + calorias + "Kcal");

            TextView revisText = (TextView) findViewById(R.id.revisadoTxt);
            revisText.setText("Revisado: " + fech);


            listview = (ListView) findViewById(R.id.alProdList);

            AlergProdAdapter jSONAdapter = new AlergProdAdapter(Scan_Result.this, jArray);

            listview.setAdapter(jSONAdapter);

            //ArrayList<AlergenosProducto> alergenos = AlergProdAdapter.alergProd;


        } catch (JSONException e) {
            Log.i("EX", e.toString());
            alert("Ups!",
                    "Lo sentimos, pero no estás registrado como usuario");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

很好,你自己做了....:)

答案 1 :(得分:0)

我通过将以下行更改为我的适配器来解决它:

@Override
public long getItemId(int position) {
   JSONObject jsonObject = getItem(position);

   return jsonObject.optLong("id");
}

到此:

 @Override
 public long getItemId(int position) {
    return position;
 }

非常感谢! :)