2016-12-27 130 views
2

我對這個主題做了大量的研究,但找不到合適的解決方案。 我只是有一個API包括學校名稱和它的緯度,經度。在Googlemap中填充json數據

[ 
    { 
     "id":1, 
     "name":"Little Angels Higher Secondary School", 
     "latitude":27.6514, 
     "longitude":85.3359 
    }, 
    { 
     "id":6, 
     "name":"Baltimore Secondary School", 
     "latitude":27.6514, 
     "longitude":85.3359 
    } 
] 

我分析這個API data.Using GPStracker類我成功列入谷歌地圖上的標記以我目前的location.Now我想一個標記添加到所有學校的位置在谷歌地圖,這樣我可以知道離我最近的學校有一次我打開谷歌地圖。這就是我做過的所有事情,它顯示出空指針異常。

package com.example.user.educationhunt.fragment; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationManager; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 

import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.Toast; 

import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.JsonArrayRequest; 
import com.example.user.educationhunt.R; 

import com.example.user.educationhunt.SchoolDetails; 
import com.example.user.educationhunt.adapter.CustomListAdapter; 
import com.example.user.educationhunt.pojos.AppController; 
import com.example.user.educationhunt.pojos.FeeClass; 
import com.example.user.educationhunt.pojos.GpsLocation; 
import com.example.user.educationhunt.pojos.MySchool; 
import com.example.user.educationhunt.pojos.OurSchool; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapView; 
import com.google.android.gms.maps.MapsInitializer; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class NearMe extends Fragment { 
    MapView mMapView; 
    private GoogleMap googleMap; 
    GpsLocation gpsLocation; 
    double longitude, latitude; 
    private ProgressDialog pDialog; 
    private RadioButton radioSexButton; 
    ArrayList al = new ArrayList(); 
    MySchool mySchool; 
    Marker place; 
    LatLng current_location ; 

    private static final String TAG = NearMe.class.getSimpleName(); 

    private static final String url = "http://www.myeducationhunt.com/api/v1/schools"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.fragment_near_me, container, false); 

     radioSexButton = (RadioButton) v.findViewById(R.id.radioSchool); 

     if (isConnected()) { 
      mMapView = (MapView) v.findViewById(R.id.mapView); 
      mMapView.onCreate(savedInstanceState); 

      mMapView.onResume(); 

      try { 
       MapsInitializer.initialize(getActivity().getApplicationContext()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      gpsLocation = new GpsLocation(getContext()); 


      if (gpsLocation.canGetLocation()) { 
       longitude = gpsLocation.getLongitude(); 
       latitude = gpsLocation.getLatitude(); 

       Toast.makeText(getContext(), "latitude:" + latitude + "Longitude:" + longitude, Toast.LENGTH_LONG).show(); 
      } 


      pDialog = new ProgressDialog(getContext()); 
      pDialog.setMessage("Loading…"); 
      pDialog.show(); 


      JsonArrayRequest schoolRequest = new JsonArrayRequest(url, 
        new Response.Listener<JSONArray>() { 
         @Override 
         public void onResponse(JSONArray response) { 
          Log.d(TAG, response.toString()); 
          hidePDialog(); 

          // Parsing json 
          for (int i = 0; i < response.length(); i++) { 
           try { 

            JSONObject obj = response.getJSONObject(i); 
            mySchool = new MySchool(); 

            mySchool.setId(""+obj.getInt("id")); 
            mySchool.setName(""+obj.getString("name")); 
            mySchool.setLatitude(Double.parseDouble(""+obj.getDouble("latitude"))); 
            mySchool.setLongitude(Double.parseDouble(""+obj.getDouble("longitude"))); 


            al.add(mySchool); 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 
          } 

         } 
        }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d(TAG, "Error: " + error.getMessage()); 
        hidePDialog(); 
       } 
      }); 

      // Adding request to request queue 
      AppController.getInstance().addToRequestQueue(schoolRequest); 


      mMapView.getMapAsync(new OnMapReadyCallback() { 
       @Override 
       public void onMapReady(GoogleMap mMap) { 
        googleMap = mMap; 

        LatLng schoollatlng = new LatLng(latitude, longitude); 
        googleMap.addMarker(new MarkerOptions().position(schoollatlng).title("MyLocation")); 
        CameraPosition cameraPosition = new CameraPosition.Builder().target(schoollatlng).zoom(10).build(); 
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

        LatLng latlng = new LatLng(mySchool.getLatitude(), mySchool.getLongitude()); 
        googleMap.addMarker(new MarkerOptions().position(latlng).title(mySchool.getName())); 
        CameraPosition cameraPosition1 = new CameraPosition.Builder().target(latlng).zoom(10).build(); 
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition1)); 
       } 
      }); 

     } else { 

      Toast.makeText(getContext(), "Please check your internet connection", Toast.LENGTH_LONG).show(); 
     } 

     return v; 
    } 

    public boolean isConnected() { 
     ConnectivityManager connMgr = (ConnectivityManager) getActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
     if (networkInfo != null && networkInfo.isConnected()) 
      return true; 
     else 
      return false; 
    } 

    private void hidePDialog() { 
     if (pDialog != null) { 
      pDialog.dismiss(); 
      pDialog = null; 
     } 
    } 
} 

有沒有人幫我?請提前

Help.Thanks這是MySchool類

package com.example.user.educationhunt.pojos; 

/** 
* Created by user on 12/28/2016. 
*/ 
public class MySchool { 

    String id; 
    String name; 
    double latitude; 
    double longitude; 

    public String getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getLatitude() { 
     return latitude; 
    } 

    public double getLongitude() { 
     return longitude; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

} 

這是我的錯誤日誌

FATAL EXCEPTION: main 
                       Process: com.example.user.educationhunt, PID: 20472 
                       java.lang.NullPointerException: Attempt to invoke virtual method 'double com.example.user.educationhunt.pojos.MySchool.getLatitude()' on a null object reference 
                        at com.example.user.educationhunt.fragment.NearMe$3.onMapReady(NearMe.java:159) 
                        at com.google.android.gms.maps.MapView$zza$1.zza(Unknown Source) 
                        at com.google.android.gms.maps.internal.zzt$zza.onTransact(Unknown Source) 
                        at android.os.Binder.transact(Binder.java:387) 
                        at zu.a(:com.google.android.gms.DynamiteModulesB:82) 
                        at maps.ad.t$5.run(Unknown Source) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:7325) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
12-28 10:06:05.046 20472-21276/com.example.user.educationhunt I/qtaguid: Untagging socket 81 

回答

3

你的學校標誌應該運行谷歌完成初始化之後。以下是代碼示例。

mMapView.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(GoogleMap mMap) { 
       googleMap = mMap; 

       LatLng schoollatlng = new LatLng(latitude, longitude); 
       googleMap.addMarker(new MarkerOptions().position(schoollatlng).title("MyLocation")); 
       CameraPosition cameraPosition = new CameraPosition.Builder().target(schoollatlng).zoom(10).build(); 
       googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

       drawSchoolMarker(); 
      } 
}); 

在類

private void drawSchoolMarker(){ 

    JsonArrayRequest schoolRequest = new JsonArrayRequest(url, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, response.toString()); 
         hidePDialog(); 

         // Parsing json 
         for (int i = 0; i < response.length(); i++) { 
          try { 

           JSONObject obj = response.getJSONObject(i); 
           MySchool school = new MySchool(); 

           school.setId(""+obj.getInt("id")); 
           school.setName(""+obj.getString("name")); 
           school.setLatitude(Double.parseDouble(""+obj.getDouble("latitude"))); 
           school.setLongitude(Double.parseDouble(""+obj.getDouble("longitude"))); 


           al.add(school); 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 

         //iterate from arraylist 
         for(MySchool school : al){ 
          LatLng latlng = new LatLng(school.getLatitude(), school.getLongitude()); 
          googleMap.addMarker(new MarkerOptions().position(latlng).title(school.getName())); 
         } 


        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
       hidePDialog(); 
      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(schoolRequest); 
} 

我沒有測試的代碼創建新的方法,但它應該工作。

+0

迭代學校的數組列表來繪製所有的學校標記。 – zzas11

+0

你上面的代碼只是給出了最後的學校location.Bro我是一個新手,如果你會告訴我如何迭代,以便我可以得到所有學校的位置,這將是偉大的。謝謝很多,我爲這個愚蠢的要求道歉 – therameshbista

+0

我用arraylist迭代編輯答案。也許,我不應該編輯答案,希望你學習基礎知識,而不是100%依賴於答案代碼。然而,我幾年前跳到幾個節目時也感覺一樣。 – zzas11

0

你應該在行中得到NullPointerException:

LatLng latlng = new LatLng(ourSchool.latitude, ourSchool.longitude); 

因爲ourSchool指向Null。您已經在ArrayList「al」中添加了所有ourSchool對象,例如:al.add(ourSchool)

現在嘗試在添加ArrayList中的數據之後從ArrayList「al」進行迭代。

此外,您的下面的代碼正在運行之前得到的url和你的「我的學校」的響應沒有初始化到那個時候。

mMapView.getMapAsync(new OnMapReadyCallback() { 
       @Override 
       public void onMapReady(GoogleMap mMap) { 
        googleMap = mMap; 

        LatLng schoollatlng = new LatLng(latitude, longitude); 
        googleMap.addMarker(new MarkerOptions().position(schoollatlng).title("MyLocation")); 
        CameraPosition cameraPosition = new CameraPosition.Builder().target(schoollatlng).zoom(10).build(); 
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

        LatLng latlng = new LatLng(ourSchool.latitude, ourSchool.longitude); 
        googleMap.addMarker(new MarkerOptions().position(latlng).title(ourSchool.schoolName)); 
        CameraPosition cameraPosition1 = new CameraPosition.Builder().target(latlng).zoom(10).build(); 
        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition1)); 
       } 
      }); 

OurSchool類:在

class OurSchool{ 

String id; 
String name; 
double latitude; 
double longitude; 


public void setId(String id){ 
this.id=id; 
} 

public String getId(){ 
return id; 
} 
public void setName(String name){ 
this.name=name; 
} 

public String getName(){ 
return name; 
} 

public void setLatitude(double latitude){ 
this.latitute=latitude; 
} 

public double getLatitude(){ 
return latitude; 
} 

public void setLongitude(String longitude){ 
this.longitude=longitude; 
} 

public double getLongitude(){ 
return longitude; 
} 


} 

然後設置值OurSchool類對象像:

ourSchool.setId(""+obj.getInt("id")); 

代替爲也其他

ourSchool.schoolId = obj.getInt("id"); 

相同的方式的設定值

+0

我弟兄解決方案在這裏,沒有搞清楚我的疑難問題。我知道我的問題 – therameshbista

+0

嗨therameshbista的,我在行中提到的解決方案也: 「現在試着從ArrayList中迭代‘人’加入後ArrayList中的數據。「 和」Manikanta「已經編寫了相同的代碼,所以我沒有寫代碼 –

+0

親愛的Arun kumar先生,我已經更新了我的問題代碼,並附上了你的建議。但是,我在getlatitude()和getlongitude ();方法在這一行。請看看並幫助解決我的錯誤current_location = new LatLng(Double.parseDouble(al.get(i).getLatitude()),Double.parseDouble(al.get(i))。 getLongitude())) – therameshbista

1

閱讀學校的所有位置後做一些東西一樣使用您的數組列表

Marker place; 
LatLng current_location ; 
    for(int i = 0; i < al.size(); i++){ 
     current_location = new LatLng(Double.parseDouble(al.get(i).getLatitude()),Double.parseDouble(al.get(i).getLongitude())); 
     place= map.addMarker(new MarkerOptions().position(current_location).title("school name here")); 
    } 
+0

這隻會放上最後一個標記。 –

+0

Bro我在getLatitude()和getLongitude()方法中有錯誤。 – therameshbista