2017-12-11 17 views
0

私は地下鉄の5つの駅を表示するためのアプリを作っています。私は駅の名前を取得し、データをリストビューに取り込むことができます。JSONデータの取得後にmapViewに複数のピンを追加する方法

私はAPIの& latを取得しており、これらの座標を使用してマップにピンを追加したいと考えています。私はマップが動作している、私は単一のピンを表示することができますが、複数のピンを表示することはできません。正しい方向のポイントが高く評価されます。下記のコードをご覧ください。

public class nearMe extends AppCompatActivity implements OnMapReadyCallback { 

    private MapView mapView; 
    public GoogleMap gmap; 
    private static final String MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey"; 

    // Location Co-ordinates 
    private String lat = ""; 
    private String lng = ""; 

    LocationManager locationManager; 
    LocationListener locationListener; 

    private List<Station> stationList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private stationAdapter mAdapter; 

    /* LOCATION STUFF  */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      startListening(); 
     } 
    } 

    public void startListening() { 

     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 

      locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 

    public void updateLocationInfo(Location location) { 
     lat = "" + location.getLatitude(); 
     lng = "" + location.getLongitude(); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_location, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // int id = item.getItemId(); 


     getNearestStations(); 
     Toast.makeText(this, "Location Updated!", Toast.LENGTH_SHORT).show(); 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_near_me); 
     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     mAdapter = new stationAdapter(stationList); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(mAdapter); 

// onClick 
     recyclerView.addOnItemTouchListener(new TouchListener(getApplicationContext(), recyclerView, new ClickListener() { 
      @Override 
      public void onClick(View view, int position) { 
       // Toast.makeText(getApplicationContext(), stationList.get(position).getStation() + "", Toast.LENGTH_SHORT).show(); 

       String findStation = stationList.get(position).getStation(); 

       // Toast.makeText(nearMe.this, bob, Toast.LENGTH_SHORT).show(); 

       Uri gmmIntentUri = Uri.parse("google.navigation:q="+findStation+"underground station+London&mode=w"); 
       Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri); 
       mapIntent.setPackage("com.google.android.apps.maps"); 
       mapIntent.setFlags(mapIntent.FLAG_ACTIVITY_CLEAR_TOP); 
       if (mapIntent.resolveActivity(getPackageManager()) != null) { 
        startActivity(mapIntent); 
       } 
      } 


     })); 

     locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       updateLocationInfo(location); 
      } 

      @Override 
      public void onStatusChanged(String provider, int status, Bundle extras) { 
      } 

      @Override 
      public void onProviderEnabled(String provider) { 
      } 

      @Override 
      public void onProviderDisabled(String provider) { 
      } 
     }; 

     if (Build.VERSION.SDK_INT < 23) { 
      startListening(); 
     } else { 
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); 
      } else { 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
       Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

       if (location != null) { 
        updateLocationInfo(location); 
       } 
      } 
     } 

     // insert Stations in to recycler 
     getNearestStations(); 

     //map 
     Bundle mapViewBundle = null; 
     if (savedInstanceState != null) { 
      mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY); 
     } 

     mapView = (MapView) findViewById(R.id.map_view); 
     mapView.onCreate(mapViewBundle); 
     mapView.getMapAsync(this); 
    } 

    // clear adapter before adding 
    public void clear() { 
     int size = this.stationList.size(); 
     this.stationList.clear(); 
     mAdapter.notifyItemRangeRemoved(0, size); 
    } 

    public void getNearestStations(){ 

     RequestQueue queue = Volley.newRequestQueue(this); 
     String url = "https://transportapi.com/v3/uk/tube/stations/near.json?app_id=157c4895&app_key=091697cea8bae89519dd02ebb318fc51&lat=" + lat + "&lon=" + lng + "&rpp=5"; 

     final StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONObject jsonObject = new JSONObject(response); 
        JSONArray jsonArray = jsonObject.getJSONArray("stations"); 

        // Call 'Clear' method to clear mAdapter before adding new data 
        clear(); 
        if (jsonArray.length() > 0) { 

         for (int i = 0; i < jsonArray.length(); i++) { 
          JSONObject jObject = jsonArray.getJSONObject(i); 

          String station = jObject.getString("name"); 

          Station newStation = new Station(station); 
          stationList.add(newStation); 

          mAdapter.notifyDataSetChanged(); 

          double longitude = Double.parseDouble(lng); 
          double latitude = Double.parseDouble(lat); 
          gmap.addMarker(new MarkerOptions() 
            .position(new LatLng(latitude, longitude)) 
            .title(station)); 

         } 
        }else{ 
         Station newStation = new Station("No stations near"); 
         stationList.add(newStation); 
         mAdapter.notifyDataSetChanged(); 

         // Show a diaog 
         AlertDialog alertDialog = new AlertDialog.Builder(nearMe.this).create(); 
         alertDialog.setTitle("No Stations Found"); 
         alertDialog.setMessage("You are either not in London or you have no network connectivity."); 
         alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", 
           new DialogInterface.OnClickListener() { 
            public void onClick(DialogInterface dialog, int which) { 
             dialog.dismiss(); 
            } 
           }); alertDialog.show(); 
        } 
       } catch (JSONException e) { } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
      } 
     }); 
     RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); 
     requestQueue.add(stringRequest); 
    } 
// maps 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     Bundle mapViewBundle = outState.getBundle(MAP_VIEW_BUNDLE_KEY); 
     if (mapViewBundle == null) { 
      mapViewBundle = new Bundle(); 
      outState.putBundle(MAP_VIEW_BUNDLE_KEY, mapViewBundle); 
     } 
     mapView.onSaveInstanceState(mapViewBundle); 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     mapView.onResume(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mapView.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     mapView.onStop(); 
    } 
    @Override 
    protected void onPause() { 
     mapView.onPause(); 
     super.onPause(); 
    } 
    @Override 
    protected void onDestroy() { 
     mapView.onDestroy(); 
     super.onDestroy(); 
    } 
    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     mapView.onLowMemory(); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 




    } 
} 
+0

「gmap」はどこで初期化しましたか? 'onMapReady'で初期化しよう: ' gmap = googleMap' – Yupi

答えて

1

あなたのAPIがmarkers配列のデータを返すとします。

for(int i = 0 ; i < markers.size() ; i++) { 

    createMarker(markers.get(i).getLatitude(), markers.get(i).getLongitude(), markers.get(i).getTitle(), markers.get(i).getSnippet(), markers.get(i).getIconResID()); 
} 

... 

protected Marker createMarker(double latitude, double longitude, String title, String snippet, int iconResID) { 

    return googleMap.addMarker(new MarkerOptions() 
      .position(new LatLng(latitude, longitude)) 
      .anchor(0.5f, 0.5f) 
      .title(title) 
      .snippet(snippet); 
      .icon(BitmapDescriptorFactory.fromResource(iconResID))); 
} 
関連する問題