Estou com uma dúvida na resolução do exercício. Segundo o exercício, na classe MapaFragment deveria ter o seguinte código:
@Override
public void onMapReady(GoogleMap googleMap) {
this.mapa = mapa; // guardamos o mapa
Mas nesse caso não seria "this.mapa = googleMap"? Se fosse "this.mapa = mapa", ele estaria recebendo o próprio atributo mapa.
Se realmente for "this.mapa = googleMap", dentro do método onMapReady está instanciando a classe Localizador:
new Localizador(getContext(), mapa);
Neste caso está passando um GoogleMap, mas o localizador espera receber um MapaFragmente, segundo o exercício, então como eu poderia resolver?
Segue meu código da classe MapaFragment:
public class MapaFragment extends SupportMapFragment implements OnMapReadyCallback {
private GoogleMap mapa;
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
this.mapa = googleMap;
LatLng posicaoDaEscola = pegaCoordenadaDoEndereco("Rua Vergueiro 3185, Vila Mariana, Sao Paulo");
if (posicaoDaEscola != null) {
centralizaEm(posicaoDaEscola);
}
AlunoDAO alunoDAO = new AlunoDAO(getContext());
for (Aluno aluno : alunoDAO.buscaAlunos()){
LatLng coordenada = pegaCoordenadaDoEndereco(aluno.getEndereco());
if(coordenada != null){
MarkerOptions marcador = new MarkerOptions();
marcador.position(coordenada);
marcador.title(aluno.getNome());
marcador.snippet(String.valueOf(aluno.getNota()));
googleMap.addMarker(marcador);
}
}
alunoDAO.close();
new Localizador(getContext(), mapa);
}
public void centralizaEm(LatLng coordenada) {
if (mapa != null) {
CameraUpdate update = CameraUpdateFactory.newLatLngZoom(coordenada, 17 );
mapa.moveCamera(update);
}
}
private LatLng pegaCoordenadaDoEndereco(String endereco) {
try {
Geocoder geocoder = new Geocoder(getContext());
List<Address> resultados = geocoder.getFromLocationName(endereco, 1);
if(!resultados.isEmpty()){
LatLng posicao = new LatLng(resultados.get(0).getLatitude(), resultados.get(0).getLongitude());
return posicao;
}
}catch (IOException e){
e.printStackTrace();
}
return null;
}
}
Classe Localizador:
public class Localizador implements GoogleApiClient.ConnectionCallbacks, LocationListener {
private final GoogleApiClient client;
private final MapaFragment mapaFragment;
public Localizador(Context context, MapaFragment mapaFragment){
client = new GoogleApiClient.Builder(context).addApi(LocationServices.API).addConnectionCallbacks(this).build();
client.connect();
this.mapaFragment = mapaFragment;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
LocationRequest request = new LocationRequest();
request.setSmallestDisplacement(50);
request.setInterval(1000);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(client, request, this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onLocationChanged(Location location) {
LatLng coordenada = new LatLng(location.getLatitude(), location.getLongitude());
mapaFragment.centralizaEm(coordenada);
}
}