android + json +如何在列表中显示提取的数据,何时单击显示单行中的数据?

时间:2014-03-10 10:43:08

标签: android json android-intent arraylist

我正在创建一个简单的Android应用程序,它从json类型的Web服务器获取数据并将其显示在listView中,而不是当我选择一行时它必须在一行中显示指定的数据,但问题是系统显示错误到所选项目以在其他活动中显示它。

谁能帮助我?

错误发生在onPostExectute方法的jsonActivityHttpClient类中,它没有列出“finalResult”列表:

 new String[] { PLACE_NAME_TAG, LATITUDE_TAG,LONGITUDE_TAG, POSTAL_CODE_TAG }

JSONParserHandler

package com.devleb.jsonparsingactivitydemo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.impl.client.BasicResponseHandler;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

public class JSONParserHandler implements ResponseHandler<List<String>> {

    public static List<String> finalResult;

    public static final String PLACE_NAME_TAG = "placeName";
    public static final String LONGITUDE_TAG = "lng";
    public static final String LATITUDE_TAG = "lat";
    private static final String ADMIN_NAME_TAG = "adminCode3";
    public static final String POSTAL_CODE_TAG = "postalcode";
    private static final String POSTALCODE = "postalcodes";

    @Override
    public List<String> handleResponse(HttpResponse response)
            throws ClientProtocolException, IOException {
        // TODO Auto-generated method stub

        finalResult = new ArrayList<String>();
        String JSONResponse = new BasicResponseHandler()
                .handleResponse(response);

        try {

            JSONObject jsonObject = (JSONObject) new JSONTokener(JSONResponse)
                    .nextValue();

            JSONArray PostalCodes = jsonObject.getJSONArray(POSTALCODE);

            for (int i = 0; i < PostalCodes.length(); i++) {
                JSONObject postalCode = (JSONObject) PostalCodes.get(i);


                String name = postalCode.getString(PLACE_NAME_TAG);
                String lat = postalCode.getString(LATITUDE_TAG);
                String lng = postalCode.getString(LONGITUDE_TAG);
                String postal = postalCode.getString(POSTAL_CODE_TAG);


                List<String>tmlResult =  new ArrayList<String>();

                tmlResult.add(name);
                tmlResult.add(lat);
                tmlResult.add(lng);
                tmlResult.add(postal);

                finalResult.addAll(tmlResult);




            }
        } catch (JSONException E) {
            E.printStackTrace();
        }

        return finalResult;
    }
}

JsonActivityHttpClient

package com.devleb.jsonparsingactivitydemo;

import java.io.IOException;
import java.util.List;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;

import android.app.ListActivity;
import android.content.Intent;
import android.net.http.AndroidHttpClient;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class JsonActivityHttpClient extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new HTTPGetTask().execute();
    }

    private class HTTPGetTask extends AsyncTask<Void, Void, List<String>> {

        private static final String USER_NAME = "devleb";

        private static final String URL = "http://api.geonames.org/postalCodeLookupJSON?postalcode=6600&country=AT&username="
                + USER_NAME;

        AndroidHttpClient mClient = AndroidHttpClient.newInstance("");

        @Override
        protected List<String> doInBackground(Void... arg0) {
            // TODO Auto-generated method stub

            HttpGet request = new HttpGet(URL);

            JSONParserHandler responseHandler = new JSONParserHandler();
            try {

                return mClient.execute(request, responseHandler);

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;

        }

        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub

            if (null != mClient) {

                mClient.close();


                ListAdapter adapter = new SimpleAdapter(
                        JsonActivityHttpClient.this, finalResult,
                        R.layout.list_item, new String[] { PLACE_NAME_TAG, LATITUDE_TAG,
                                LONGITUDE_TAG, POSTAL_CODE_TAG }, new int[] { R.id.countryname,
                                R.id.lat, R.id.lng, R.id.postalcode });

                setListAdapter(adapter);
            }

                //setListAdapter(new ArrayAdapter<String>(
                    //  JsonActivityHttpClient.this, R.layout.list_item, result));

            }

        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.json_activity_http_client, menu);
        return true;
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);


        String place_name = ((TextView) v.findViewById(R.id.countryname)).getText().toString();
        String lat = ((TextView) v.findViewById(R.id.lat)).getText().toString();
        String lng = ((TextView) v.findViewById(R.id.lng)).getText().toString();
        String postal_code = ((TextView) v.findViewById(R.id.postalcode)).getText().toString();


        Intent in = new Intent(getBaseContext(), RowItem.class);
        in.putExtra(PLACE_NAME_TAG, value)





    }

}

MainActivity

package com.devleb.jsonparsingactivitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    final @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button bntLoad = (Button) findViewById(R.id.btnload);

        bntLoad.setOnClickListener(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        startActivity(new Intent(getBaseContext(), JsonActivityHttpClient.class));
    }

}

RowItem

package com.devleb.jsonparsingactivitydemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class RowItem extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.row_item);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.row_item, menu);
        return true;
    }

}

1 个答案:

答案 0 :(得分:2)

我在你的代码中看到了2个问题:

1-您定义了AsyncTask类,如

AsyncTask<Void, Void, List<String>>

但是您在onPostExecute方法上获得了Void,因此您需要更改

protected void onPostExecute(Void result)

protected void onPostExecute(List<String> result)

2-你尝试访问onPostExecute上的finalResult,你可以在JSONParserHandler上将其定义为静态,所以如果你想要你需要的访问权限:

JSONParserHandler.finalResult

但是当你在doInBackground方法上返回时,你可以通过以下方式访问它:

result

你进入onPostExecute。

然后你需要检查result是否等于null,因为你在catch之后返回null

你的onPostExecute必须像:

protected void onPostExecute(List<String> result) {
            // TODO Auto-generated method stub

            if (null != mClient) {

                mClient.close();

             if (result != null)
             {
                ListAdapter adapter = new SimpleAdapter(
                        JsonActivityHttpClient.this, result,
                        R.layout.list_item, new String[] { PLACE_NAME_TAG, LATITUDE_TAG,
                                LONGITUDE_TAG, POSTAL_CODE_TAG }, new int[] { R.id.countryname,
                                R.id.lat, R.id.lng, R.id.postalcode });

                setListAdapter(adapter);
            }
            else
                // do any thing you want for error happened
            }