1

Eu estou tentando fazer um loop de markers do google maps, pegando informações de um json, mas estou parado em "transferir" as informações do doinbackground para o método Google google. Para entender melhor, segue o meu código:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private ProgressDialog pDialog;
Conexao cx ;

private static String url = "json.php";

private static final String TAG_ID = "evento_id";
private static final String TAG_TITULO = "titulo";
private static final String TAG_DESCRICAO = "descricao";
private static final String TAG_LONGITUDE = "longitude";
private static final String TAG_LATITUDE = "latitude";


MapasController mc = new MapasController();


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

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);


    new MapaGet().execute();


}

private class MapaGet extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pDialog = new ProgressDialog(MapsActivity.this);
        pDialog.setMessage("Por favor, aguarde...");
        pDialog.setCancelable(true);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {

        cx =  new Conexao();
        String jsonStr = cx.get(url);

        Log.d("Resposta: ", "> " + jsonStr);

        if (jsonStr != null) {

            try {

                JSONArray jsonArray = new JSONArray(jsonStr);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObj = jsonArray.getJSONObject(i);


                   mc.setLatitude(jsonObj.getDouble(TAG_LATITUDE));
                   mc.setLongitude(jsonObj.getDouble(TAG_LONGITUDE));

                   mc.setTitulo(jsonObj.getString(TAG_TITULO));
                   mc.setDescricao(jsonObj.getString(TAG_DESCRICAO));
                   mc.setId(jsonObj.getString(TAG_ID));


                }
            } catch (JSONException e) {
                Log.e("tag", "Error processing JSON", e);
            }


        } else {
            Log.e("Get: ", "Não foi possível obter quaisquer dados do url");
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (pDialog.isShowing())
            pDialog.dismiss();
        }

}


@Override
public void onMapReady(GoogleMap googleMap) {


mMap = googleMap;

LatLng local = new LatLng(mc.getLatitude(), mc.getLongitude());
mMap.addMarker(new MarkerOptions()
        .position(local)
        .title(mc.getTitulo())
        .snippet(mc.getDescricao())
        .draggable(true));
mMap.moveCamera(CameraUpdateFactory.newLatLng(local));


    mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            Intent in = new Intent(MapsActivity.this,DescricaoMaps.class);
            in.putExtra(TAG_ID, mc.getId());
            in.putExtra(TAG_TITULO, mc.getTitulo());
            in.putExtra(TAG_DESCRICAO, mc.getDescricao());
            startActivity(in);


        }
    });

}

Alguém consegue me dar uma luz de qual é a melhor forma de eu fazer o loop do markers usando esse código?

1 Resposta 1

2

Para isso é necessário usar uma lista!

No AsyncTask, altera se a tela apenas no metodo onPostExecute!

Segue uma sugestão:

@Override
public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;
    // se o mapa não está nulo , vamos carregar
    if(mMap != null){
        new MapaGet().execute();
    }
}


private class MapaGet extends AsyncTask<Void, Void, Void> {

    // Lista onde vamos guardar os valores 
    List<MapasController> ListaDeController = new ArayList<MapasController>(0);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MapsActivity.this);
        pDialog.setMessage("Por favor, aguarde...");
        pDialog.setCancelable(true);
        pDialog.show();

    }

    @Override
    protected Void doInBackground(Void... arg0) {

        cx = new Conexao();
        String jsonStr = cx.get(url);

        Log.d("Resposta: ", "> " + jsonStr);

        if (jsonStr != null) {

            try {

                JSONArray jsonArray = new JSONArray(jsonStr);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObj = jsonArray.getJSONObject(i);

              // Criamos um novo Elemento! Para não sobreescrever o anterior!
               MapasController mc = new MapasController();

                    mc.setLatitude(jsonObj.getDouble(TAG_LATITUDE));
                    mc.setLongitude(jsonObj.getDouble(TAG_LONGITUDE));

                    mc.setTitulo(jsonObj.getString(TAG_TITULO));
                    mc.setDescricao(jsonObj.getString(TAG_DESCRICAO));
                    mc.setId(jsonObj.getString(TAG_ID));

                    // Adicionamos na lista
                    ListaDeController.add(mc);

                }
            } catch (JSONException e) {
                Log.e("tag", "Error processing JSON", e);
            }


        } else {
            Log.e("Get: ", "Não foi possível obter quaisquer dados do url");
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);


        // Se o tamanho da lista fo maior que zero! 
        if(ListaDeController.size() > 0){
            for(MapasController mc  : ListaDeController){

                LatLng local = new LatLng(mc.getLatitude(), mc.getLongitude());
                mMap.addMarker(new MarkerOptions()
                        .position(local)
                        .title(mc.getTitulo())
                        .snippet(mc.getDescricao())
                        .draggable(true));
                mMap.moveCamera(CameraUpdateFactory.newLatLng(local));


                mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick(Marker marker) {
                        Intent in = new Intent(MapsActivity.this, DescricaoMaps.class);
                        in.putExtra(TAG_ID, mc.getId());
                        in.putExtra(TAG_TITULO, mc.getTitulo());
                        in.putExtra(TAG_DESCRICAO, mc.getDescricao());
                        MapsActivity.this.startActivity(in);

                    }
                });

            }
        }
        if (pDialog.isShowing())
            pDialog.dismiss();
    }

}
8
  • Olá, muito obrigado pela sua dica, foi muito útil. Eu usei essas informações no meu código, mas está puxando ainda só 1 valor (1 marker), você imagina o que pode ser? Commented 22/07/2016 às 14:09
  • Quantos retornam na lista? Commented 22/07/2016 às 14:10
  • meu json retorna 4 como exemplos, e no marker do android aparece apenas 1 Commented 22/07/2016 às 14:11
  • na verdade, ele está aparecendo 4, só que um em cima do outro, ou seja com o mesmo valor todos e mesmo nome e descricao..rs Commented 22/07/2016 às 14:13
  • Veja o tamanho da lista (ListaDeController.size()) ! Coloque um Log pra ser se no ** onPostExecute** chega as 4! Commented 22/07/2016 às 14:15

Você deve fazer log-in para responder a esta pergunta.

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .