如何通过改造来填充一个arraylist

时间:2016-12-08 17:43:40

标签: android arraylist retrofit

我有一个返回一些数据的服务,我已经可以获取这些数据并在文本视图或log / toast中并置,但我想将它包含在一个ArrayList中,以便谷歌地图读取,但是我试过的方式,是出现错误。下面的代码和错误

MainActivity。

@Override
public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        // create class object
        gps = new GPSTracker(MainActivity.this);

       this.getOccurrence();

        // check if GPS enabled
        if(gps.canGetLocation()){

            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();


            LatLng local = new LatLng(latitude, longitude);
            mMap.addMarker(new MarkerOptions().position(local));
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(local, 16));

            // Create a heat map tile provider, passing it the lat long of the police stations.
            mProvider = new HeatmapTileProvider.Builder()
                    .data(list) // Error happens here
                    .build();
            // Add a tile overlay to the map, using the heat map tile provider.
            mOverlay = mMap.addTileOverlay(new TileOverlayOptions().tileProvider(mProvider));

        }else{
            gps.showSettingsAlert();
        }


    private void getOccurrence() {
        try {
            list = readItems();
        } catch (JSONException e) {
            Toast.makeText(this, "Error", Toast.LENGTH_LONG).show();
        }

    }


    private List<LatLng> readItems() throws JSONException {
    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
    final Call<List<MyPojo>> call = apiService.getResut();
    call.enqueue(new Callback<List<MyPojo>>() {
        @Override
        public void onResponse(Call<List<MyPojo>> call, Response<List<MyPojo>> response) {

            try {
                List<MyPojo> LatLngData = response.body();
                Log.v(TAG, "LOGS" + LatLngData.size());
                ArrayList<LatLng> list = new ArrayList<LatLng>();
                for (int i = 0; i < LatLngData.size(); i++) {
                    double lat = LatLngData.get(i).getLat();
                    double lng = LatLngData.get(i).getLng();
                    list.add(new LatLng(lat, lng));
                }

            } catch (Exception e) {
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
        }
        @Override
        public void onFailure(Call<List<MyPojo>> call, Throwable t) {

        }
    });
    Log.v(TAG, "" + list);
    return list;
}

MyPojo(型号)

import com.google.gson.annotations.SerializedName;

public class MyPojo {

    @SerializedName("lat")
    private Double lat;

    @SerializedName("lng")
    private Double lng;

    public MyPojo(Double lat, Double lng) {
        this.lat = lat;
        this.lng = lng;
    }


    public Double getLat() {
        return lat;
    }

    public void setLat(Double lat) {
        this.lat = lat;
    }

    public Double getLng() {
        return lng;
    }

    public void setLng(Double lng) {
        this.lng = lng;
    }
}

ApiInterface

public interface ApiInterface {

    @Headers("Accept: application/json")
    @GET("/locations")
    Call<List<MyPojo>> getResult();

}

错误

1

2-08 14:13:53.348 3823-3823/
  br.com.example E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: br.com.example, PID: 3823
                                                                      java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.Collection.iterator()' on a null object reference
                                                                          at br.com.example.googlemaps.heatmaps.HeatmapTileProvider.wrapData(HeatmapTileProvider.java:346)
                                                                          at br.com.example.googlemaps.heatmaps.HeatmapTileProvider.access$000(HeatmapTileProvider.java:39)
                                                                          at br.com.example.googlemaps.heatmaps.HeatmapTileProvider$Builder.data(HeatmapTileProvider.java:188)
                                                                          at br.com.example.activity.MainActivity.onMapReady(MainActivity.java:140)
                                                                          at com.google.android.gms.maps.SupportMapFragment$zza$1.zza(Unknown Source)
                                                                          at com.google.android.gms.maps.internal.zzo$zza.onTransact(Unknown Source)
                                                                          at android.os.Binder.transact(Binder.java:499)
                                                                          at yd.a(:com.google.android.gms.DynamiteModulesB:82)
                                                                          at maps.ad.t$5.run(Unknown Source)
                                                                          at android.os.Handler.handleCallback(Handler.java:751)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:154)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

2 个答案:

答案 0 :(得分:1)

initialized ArrayList 

        private List<LatLng> readItems() throws JSONException {
    List<LatLng> list=new List<>();
        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        final Call<List<MyPojo>> call = apiService.getResut();
        call.enqueue(new Callback<List<MyPojo>>() {
            @Override
            public void onResponse(Call<List<MyPojo>> call, Response<List<MyPojo>> response) {

                try {
                    List<MyPojo> LatLngData = response.body();
                    Log.v(TAG, "LOGS" + LatLngData.size());
                    ArrayList<LatLng> list = new ArrayList<LatLng>();
                    for (int i = 0; i < LatLngData.size(); i++) {
                        double lat = LatLngData.get(i).getLat();
                        double lng = LatLngData.get(i).getLng();
                        list.add(new LatLng(lat, lng));
                    }

                } catch (Exception e) {
                    Log.d("onResponse", "There is an error");
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<List<MyPojo>> call, Throwable t) {

            }
        });
        Log.v(TAG, "" + list);
        return list;
    }

答案 1 :(得分:1)

<强> ApiInterface

try {
    String input = "Thu, 8 Dec 2016 09:54:00 GMT";
    SimpleDateFormat sdf1 = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z");
    Date date1 = sdf1.parse(input);
    SimpleDateFormat sdf2 = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
    String date2 = sdf2.format(date1);
    System.out.println("Parsed : " + date2);  //Parsed : 08-12-2016 09:54:00
} catch (Exception e) {
    System.out.println(e);
}

希望你已经添加了像这样的改装的gson转换器

public interface ApiInterface {

    @Headers("Accept: application/json")
    @GET("/locations")
    Call<ArrayList<MyPojo>> getResult();

}

初始化您的arraylist

addConverterFactory(GsonConverterFactory.create())

更改您的方法,如下所示

ArrayList<MyPojo> latLngData = new ArrayList<MyPojo>()

在这个方法中

private ArrayList<LatLng> readItems() throws JSONException {
    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
    final Call<ArrayList<MyPojo>> call = apiService.getResut();
    call.enqueue(new Callback<ArrayList<MyPojo>>() {
        @Override
        public void onResponse(Call<ArrayList<MyPojo>> call, Response<ArrayList<MyPojo>> response) {

            try {
                latLngData.addAll(response.body()) ;
                Log.v(TAG, "LOGS" + LatLngData.size());
                ArrayList<LatLng> list = new ArrayList<LatLng>();
                for (int i = 0; i < latLngData.size(); i++) {
                    double lat = latLngData.get(i).getLat();
                    double lng = latLngData.get(i).getLng();
                    list.add(new LatLng(lat, lng));
                }

            } catch (Exception e) {
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
        }
        @Override
        public void onFailure(Call<ArrayList<MyPojo>> call, Throwable t) {

        }
    });
    Log.v(TAG, "" + list);
    return list;
}

确保 private void getOccurrence() { try { list = readItems(); } catch (JSONException e) { Toast.makeText(this, "Error", Toast.LENGTH_LONG).show(); } } 已声明并初始化为list

请告诉我这是否适合您。