如何将json listview上所选项目的值发送到另一个活动?

我正在创建一个应用程序,从JSON获取国家/地区数据(名称,纬度,经度……)并创建listview ,其中每个项目都是不同的国家/地区。

该部分正在运行但是,每次我点击某个项目时,它都会打开MapActivity,地图位于该国家/地区的中心位置。 问题是我无法将MainActivity中的坐标发送到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> 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 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 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); } }); } } } 

HashMap实现了Serializable因此我们可以使用putExtra发送HashMap对象并使用putExtra接收它

TodasAsCategorias活动

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

MapsActivity

 protected void onCreate(Bundle bundle) { super.onCreate(savedInstanceState); Intent intent = getIntent(); HashMap hashMap = (HashMap)intent.getSerializableExtra("data"); String lat = hashMap.get("Coord_LAT"); String longi = hashMap.get("Coord_LONG"); } 

通过Extras将您的数据传输到MapsActivity。 像这样开始活动:

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

并在MapsActivity中检索数据:

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

onItemClick()方法提供单击的列表项的“位置”。 该位置的项目包含您想要传递给其他活动所需的纬度和经度。 然后,可以使用Extras按照其他答案的说明传递纬度和经度。

更新:由于您的listaPaises是一个实例变量,@ PavneetSingh答案会更直接。

您可以覆盖SimpleAdapter的getItem(int位置)以返回HashMap条目:

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

然后在ListView的setOnItemClickListener(…)方法中,您可以通过调用以下方式获取返回的条目:

 HashMap pais = (HashMap) adapter.getItem(position) 

并使用Intent的putExtra()方法将HashMap条目传递给MapsActivity。

请注意,为了在匿名内部类中调用适配器,您需要将本地变量ListAdapter适配器更改为类的实例变量。