How to send values from a selected item on a json

2019-03-05 05:53发布

问题:

I'm making an app that gets countries data (name, latitude, longitude, ...) from JSON and creates a listview, where each item is a different country.

That part is working but, every time I click on a item it opens the MapActivity, with the map centered in that country. The problem is that I can't send the coordinates from the MainActivity to the MapsActivity.

public class TodasAsCategorias extends AppCompatActivity {

private String TAG = TodasAsCategorias.class.getSimpleName();
private ProgressDialog pDialog;
private ListView lv;
private static String url = "http://*************/api/continent/any/country/all?id=siF1uXXEsltXOi5CWlSIzy7EABlnE5iF33bnNmfAHJiYXYNmjY";
ArrayList<HashMap<String, String>> listaPaises;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_todas_as_categorias);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle("Categorias");

    listaPaises = new ArrayList<>();
    lv = (ListView) findViewById(R.id.list);
    new GetPaises().execute();
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    menu.findItem(R.id.spinner_cat).setVisible(false);
    menu.findItem(R.id.spinner_pais).setVisible(false);
    return true;
}

private class GetPaises extends AsyncTask<Void, Void, Void> implements Serializable {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(TodasAsCategorias.this);
        pDialog.setMessage("Aguarde...");
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        HttpHandler sh = new HttpHandler();
        final String jsonStr = sh.makeServiceCall(url);
        Log.e(TAG, "Response from URL: " + jsonStr);
        if (jsonStr != null) {
            try {
                JSONArray array = new JSONArray(jsonStr);
                for (int i = 0; i < array.length(); i++) {
                    JSONObject jsonObject = array.getJSONObject(i);
                    JSONArray paises = jsonObject.optJSONArray("paises");
                    if (paises != null) {
                        for (int j = 0; j < paises.length(); j++) {
                            JSONObject jsonObject1 = paises.getJSONObject(j);

                            String K_PAIS = jsonObject1.getString("K_PAIS");
                            String Designacao = jsonObject1.getString("Designacao");
                            String URL_IMAGE_SMALL = jsonObject1.getString("URL_IMAGE_SMALL");
                            String Coord_LAT = jsonObject1.getString("Coord_LAT");
                            String Coord_LONG = jsonObject1.getString("Coord_LONG");
                            String Coord_Zoom = jsonObject1.getString("Coord_Zoom");

                            HashMap<String, String> pais = new HashMap<>();

                            pais.put("K_PAIS", K_PAIS);
                            pais.put("Designacao", Designacao);
                            pais.put("URL_IMAGE_SMALL", URL_IMAGE_SMALL);
                            pais.put("Coord_LAT", Coord_LAT);
                            pais.put("Coord_LONG", Coord_LONG);
                            pais.put("Coord_Zoom", Coord_Zoom);

                            listaPaises.add(pais);
                        }
                    }
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Json parsin error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                });
            }

        } else {
            Log.e(TAG, "Couldn't get json from server.");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errpr!", Toast.LENGTH_LONG).show();
                }
            });
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        if (pDialog.isShowing()) {
            pDialog.dismiss();
        }
        ListAdapter adapter = new SimpleAdapter(TodasAsCategorias.this, listaPaises, R.layout.list_item, new String[]{ "Designacao","Coord_LAT", "Coord_LONG", "Coord_Zoom"},
                new int[]{R.id.Designacao,R.id.Lat, R.id.Long, R.id.Zoom});
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> pare, View view, int position, long id) {
                Intent intent = new Intent(TodasAsCategorias.this, MapsActivity.class);

                startActivity(intent);
            }
        });
    }
}
}

回答1:

HashMap implements Serializable so we can send HashMap object using putExtra and receive it using getSerializableExtra

TodasAsCategorias activity

  @Override
  public void onItemClick(AdapterView<?> pare, View view, int position, long id)     
  {
       Intent intent = new Intent(TodasAsCategorias.this, MapsActivity.class);
       intent.putExtra("data", listaPaises.get(position));
       startActivity(intent);
  }

In MapsActivity

protected void onCreate(Bundle bundle) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    HashMap<String, String> hashMap = (HashMap<String, String>)intent.getSerializableExtra("data");
    String lat = hashMap.get("Coord_LAT");
    String longi = hashMap.get("Coord_LONG");
}


回答2:

Transmit your data to MapsActivity via Extras. Start activity like this:

Intent intent = new Intent(TodasAsCategorias.this, MapsActivity.class);
intent.putExtra("Coord_LAT", value);
intent.putExtra("Coord_LONG", value);
startActivity(intent);

And retrieve data in MapsActivity:

String Coord_LAT = getIntent().getStringExtra("Coord_LAT");
String Coord_LONG = getIntent().getStringExtra("Coord_LONG");


回答3:

The onItemClick() method, provides the "position" of the list item that was clicked. The item at the position contains the latitude and longitude that you need to pass to the other activity I guess. Then, the latitude and longitude can be passed as explained by the other answers, using Extras.



回答4:

Updated: since your listaPaises is an instance variable, @PavneetSingh answer would be more straight forward.

You may override the getItem(int position) of the SimpleAdapter to return the HashMap entry:

ListAdapter adapter = new SimpleAdapter(this, listaPaises, R.layout.list_item,
                new String[]{"Designacao", "Coord_LAT", "Coord_LONG", "Coord_Zoom"},
                new int[]{R.id.Designacao, R.id.Lat, R.id.Long, R.id.Zoom}) {
            @Override
            public Object getItem(int position) {
                if (listaPaises!=null) {
                    return listaPaises.get(position);
                }
                return super.getItem(position);
            }
        };

then in your ListView's setOnItemClickListener(...) method, you can get the returned entry by calling:

HashMap<String, String> pais = (HashMap<String, String>) adapter.getItem(position)

and pass the HashMap entry with Intent's putExtra() method to MapsActivity.

Kindly note that in order to call the adapter within the anonymous inner class, you would need to change the local variable ListAdapter adapter to instance variable of your class.