martes, 5 de febrero de 2013

Listado de latitud y longitud de ciudades

Introducción:

En este tutorial vamos a crear una aplicación que nos permita leer las latitudes y longitudes de las diferentes ciudades que se encuentran en un fichero json.

Para ello la aplicación leerá todos los datos del fichero json y listará todas las ciudades en un listView, después el usuario podrá seleccionar una ciudad y la aplicación mostrará al usuario  las latitudes y longitudes almacenadas en el fichero json.

Espero que os guste y os resulte fácil. No dude en comentar.

¡ Saludos !


Enlaces de interés:

Código Fuente
Puede descargar si lo desea el código fuente de este proyecto.


Pasos a seguir:

1. Creamos la interfaz de la actividad principal en donde se mostrará las ciudades almacenadas en el fichero json, un ejemplo de interfaz sería el siguiente.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/lstvCiudades" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ListView> </RelativeLayout>

2. Creamos la interfaz de la segunda actividad donde vamos a mostrar los datos de la latitud y de la longitud de la ciudad que hemos seleccionado en la actividad principal.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ciudad" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtNombreCiudad" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/latitud" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtLatitud" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/longitud" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtLongitud" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </LinearLayout> </RelativeLayout>

3. Creamos la clase modelo de ciudad la cual utilizaremos para guardar las ciudades que hemos extraido del fichero json.

package com.ACDAT.ejercicio8.Ciudad; import java.io.Serializable; /** * Crea una ciudad * * @author José Miguel Acosta Martín * */ @SuppressWarnings("serial") public class Ciudad implements Serializable{ /////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////// private String ciudad; // Almacena el nombre de la ciudad private String latitud; // Almacena la latidud de la ciudad private String longitud; // Almacena la longitud de la ciudad /////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTOR // /////////////////////////////////////////////////////////////////////////////////////////////// /** * Crea una nueva instancia de la clase * * @param ciudad Nombre de la ciudad * @param latitud Latitud de la ciudad * @param longitud Longitud de la ciudad */ public Ciudad(String ciudad, String latitud, String longitud) { super(); this.ciudad = ciudad; this.latitud = latitud; this.longitud = longitud; } /////////////////////////////////////////////////////////////////////////////////////////////// // FIN CONSTRUCTOR // /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// // PROPIEDADES // /////////////////////////////////////////////////////////////////////////////////////////////// /** * @return El nombre de la ciudad */ public String getCiudad() { return ciudad; } /** * @return La latitud de la ciudad */ public String getLatitud() { return latitud; } /** * @return La longitud de la ciudad */ public String getLongitud() { return longitud; } /////////////////////////////////////////////////////////////////////////////////////////////// // FIN PROPIEDADES // /////////////////////////////////////////////////////////////////////////////////////////////// }

4. Definimos los campos en la actividad principal de la aplicación, que será en la clase en donde se van a listar las ciudades extraídas.

/** * Muestra un listado de ciudades alamacenadas en un fichero JSON * Se puede seleccionar para ver más detalles * * @author José Miguel Acosta Martín * */ public class LatitudesActivity extends Activity { /////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private ListView lstvCiudades; // Campo gráfico donde se muestran los nombre de las ciudades // Otros campos private ArrayList<Ciudad> ciudades; // Almacena un listado de ciudades private String[] nombreCiudades; // Almacena los nombre de las ciudades private ArrayAdapter<String> adaptador; // Adaptador /////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////

5. Iniciamos los campos necesarios en el método onCreate() además de subscribirse a los eventos.

/** * Al iniciar la aplicación ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_latitudes); // INICIALIZACIÓN DE CAMPOS //////////////////////////////////////////////////////////////// // Inicialización campos gráficos lstvCiudades = (ListView) findViewById(R.id.lstvCiudades); // Inicialización de otros campos ciudades = new ArrayList<Ciudad>(); // FIN INICIALIZACIÓN DE CAMPOS //////////////////////////////////////////////////////////// // Obtiene y almacena las ciudadades leerCiudades(obtenerJson()); // Obtiene y almacena el nombre de las ciudades leerNombreCiudades(); // Adaptador para la lista adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nombreCiudades); // Asigna el adaptador a la lista lstvCiudades.setAdapter(adaptador); ///////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////// lstvCiudades.setOnItemClickListener(new OnItemClickListener() { /** * Muestra información detallada de la ciudad seleccionada */ public void onItemClick(AdapterView<?> adaptador, View vista, int posicion, long arg3) { // CAMPOS ////////////////////////////////////////////////////////////////////////// Intent intent; // FIN CAMPOS ////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////// // Obtiene la ciudad seleccionada intent = new Intent(LatitudesActivity.this, CiudadActivity.class); intent.putExtra("CIUDAD", ciudades.get(posicion)); // Inicia la actividad CiudadActivity donde se mostrarán los datos de la ciudad startActivity(intent); // FIN EJECUCIÓN /////////////////////////////////////////////////////////////////// } }); ///////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ///////////////////////////////////////////////////////////////////////////////////////////////// }

6. Necesitamos un método para obtener el contenido del fichero json.

/** * Obtiene el contenido del fichero JSON que tiene almacenada * las latitudes * * @return El objeto JSON */ public JSONObject obtenerJson(){ // CAMPOS ///////////////////////////////////////////////////////////////////////////////// JSONObject json = null; // Almacena el objeto JSON StringBuilder stringBuilder; // Almacena el contenido del fichero JSON String linea; // Almacena la línea leida del fichero JSON // FIN CAMPOS ///////////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////////////// try { // Inicialización de campos stringBuilder = new StringBuilder(); linea = null; // Obtiene el fichero JSON InputStream fichero = getResources().openRawResource(R.raw.latitudes); // Prepara el fichero para su lectura BufferedReader bfreader = new BufferedReader(new InputStreamReader(fichero)); // Lee el fichero JSON while ((linea = bfreader.readLine()) != null){ // Añade el contenido líena a línea stringBuilder.append(linea + "\n"); } // Cierra el fichero fichero.close(); // Crea el objeto JSON json = new JSONObject(stringBuilder.toString()); } catch (Exception ex) { } return json; // FIN EJECUCIÓN /////////////////////////////////////////////////////////////////////////// }
7. Y también necesitamos un método que extraigas las ciudades con todos sus datos.

/** * Lee las ciuades almacenadas en un fichero JSON * * @param json Fichero JSON */ public void leerCiudades (JSONObject json){ // CAMPOS ////////////////////////////////////////////////////////////////////////////////// String ciudad; // Almacena el nombre de la ciudad String latitud; // Almacena la latitud de la ciudad String longitud; // Almacena la longitud de la ciudad JSONArray arrayCiudades; // Almacena las ciudades JSONObject objeto; // Almacena un objeto JSONObject objetoCiudad; // Almacena el objeto ciudad // FIN CAMPOS ////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////////////////////////////////// // Inicialización de variables ciudad = ""; latitud = ""; longitud = ""; try { // Inicialización de campos objeto = new JSONObject(); objetoCiudad = new JSONObject(); // Almacena las ciudades arrayCiudades = new JSONArray(json.getJSONArray("ciudades").toString()); // Recorre las ciudades for (int i = 0; i < arrayCiudades.length(); i++){ // Obtine la ciudad objeto = arrayCiudades.getJSONObject(i); objetoCiudad = objeto.getJSONObject("ciudad"); // Almacena los datos de la ciudad ciudad = objetoCiudad.getString("nombre"); // Almacena el nombre de la ciudad latitud = objetoCiudad.getString("latitud"); // Almacena la latidud de la ciudad longitud = objetoCiudad.getString("longitud"); // Almacena la longitud de la ciudad // Almacena la ciudad obtenida ciudades.add(new Ciudad(ciudad, latitud, longitud)); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////// }

8. Y almacenamos el nombre de las ciudades en el arraylist.

/** * Almacena el nombre de las ciudades */ public void leerNombreCiudades(){ // Inicializa el array nombreCiudades = new String[ciudades.size()]; // Recorre las ciudades almacenadas for (int i = 0; i < nombreCiudades.length; i++){ // Almacena el nombre de la ciudad nombreCiudades[i] = ciudades.get(i).getCiudad(); } }

9. Declaramos los campos que vamos a utilizar en la clase de la segunda actividad.

/** * Muestra el contenido de una ciudad * * @author José Miguel Acosta Martín * */ public class CiudadActivity extends Activity { ///////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ///////////////////////////////////////////////////////////////////////////////////////////////// private TextView txtNombreCiudad; // Campo gráfico que muestra el nombre de la ciudad private TextView txtLatitud; // Campo gráfico que muestra la latitud de la ciudad private TextView txtLongitud; // Campo gráfico que muestra la longitud de la ciudad ///////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // /////////////////////////////////////////////////////////////////////////////////////////////////
10. Iniciamos los campos en el método onCreate().

/** * Al iniciar la aplicación ... */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ciudad); // INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////////// // Incialización de campos gráficos txtNombreCiudad = (TextView) findViewById(R.id.txtNombreCiudad); txtLatitud = (TextView) findViewById(R.id.txtLatitud); txtLongitud = (TextView) findViewById(R.id.txtLongitud); // FIN INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////// // Lee y muestra los datos de la ciudad leerDatos(); }

11. Leemos los datos que recibimos de la actividad principal y los mostramos.

/** * Lee y muestra los datos de la ciudad */ public void leerDatos(){ // CAMPOS //////////////////////////////////////////////////////////////////////////////////// Intent intent; Ciudad ciudad; // Almacena la ciudad obtenida // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////// // Obtiene la ciudad intent = getIntent(); ciudad = (Ciudad) intent.getSerializableExtra("CIUDAD"); // Muestra los datos de la ciudad txtNombreCiudad.setText(ciudad.getCiudad()); txtLatitud.setText(ciudad.getLatitud()); txtLongitud.setText(ciudad.getLongitud()); // FIN EJECUCIÓN ////////////////////////////////////////////////////////////////////////////// }


FIN

No hay comentarios:

Publicar un comentario