我正在制作一个从 JSON
获取国家数据(名称,纬度,经度,...)并创建listview
的应用程序,其中每个项目都是不同的国家。
该部分正在工作,但是,每次我单击一个项目时,地图都以该国为中心。问题在于我无法将坐标从主动脉发送到映射。
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);
}
});
}
}
}
HashMap
实现Serializable
,因此我们可以使用putExtra
发送HashMap
对象并使用getSerializableExtra
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<String, String> hashMap = (HashMap<String, String>)intent.getSerializableExtra("data");
String lat = hashMap.get("Coord_LAT");
String longi = hashMap.get("Coord_LONG");
}
通过Extras将数据传输到映射性。这样的开始活动:
Intent intent = new Intent(TodasAsCategorias.this, MapsActivity.class);
intent.putExtra("Coord_LAT", value);
intent.putExtra("Coord_LONG", value);
startActivity(intent);
并在图中检索数据:
String Coord_LAT = getIntent().getStringExtra("Coord_LAT");
String Coord_LONG = getIntent().getStringExtra("Coord_LONG");
onItemClick()方法提供了单击的列表项的"位置"。该位置的项目包含您猜想的其他活动所需的纬度和经度。然后,使用其他答案可以通过其他答案来传递纬度和经度。
更新:由于您的listApaises是一个实例变量,@pavneetsingh的答案将更加直接。
您可以覆盖SimpleDeadapter的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<String, String> pais = (HashMap<String, String>) adapter.getItem(position)
并以意图的putextra()方法传递hashmap条目进行映射。
请注意,要在匿名内部类中调用适配器,您将需要更改local variable listAdapter adapter 将类的实例变量更改为类的实例变量。