【问题标题】:getting all the records from LTA carpark API从 LTA carpark API 获取所有记录
【发布时间】:2019-04-07 10:44:40
【问题描述】:

我正在创建一个导航应用程序,它将显示新加坡的所有停车场位置。我有 2 个课程,HomeUI 和 Appmanager。 HomeUI 将解析来自 carpark API 的 json 数据并将其存储在 arraylist 中。然后我创建了一个名为 getarraylist() 的方法,以便我的 Appmanager 可以访问此方法并获取 arraylist 中的值。但是,我只能打印出数组列表的最后一个值,我没有其他想法了。请检查我的代码,看看是否可以改进。

HomeUI 类:

    package teamjake.com.drivesafe.Boundary;

    import android.Manifest;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.support.design.widget.TabLayout;
    import android.support.design.widget.NavigationView;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.content.ContextCompat;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.view.ViewPager;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.ScrollView;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.android.volley.AuthFailureError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonObjectRequest;
    import com.google.android.gms.common.api.GoogleApiClient;
    import com.google.android.gms.location.LocationRequest;
    import com.google.android.gms.location.places.ui.PlaceAutocompleteFragment;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;
    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.HashMap;
    import java.util.List;
    import java.util.Map;

    import teamjake.com.drivesafe.AppController;
    import teamjake.com.drivesafe.CarparkAvailabilityUI;
    import teamjake.com.drivesafe.Control.AppManager;
    import teamjake.com.drivesafe.Control.UserAccountManager;
    import teamjake.com.drivesafe.Const;
    import teamjake.com.drivesafe.R;
    import teamjake.com.drivesafe.RoadWorksUI;
    import teamjake.com.drivesafe.TrafficIncidentUI;


public class HomeUI extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback {
    private SupportMapFragment mMap;
    PlaceAutocompleteFragment placeAutoComplete;
    private GoogleApiClient googleApiClient;
    private LocationRequest locationRequest;
    private Location lastLocation;
    private LocationManager locManager;
    private TextView nametxtView;
    private Marker currentUserLocationMarker;
    private static final int Request_User_Location_Code = 99;
    private double latitude, longitude;
    private int ProximityRadius = 10000;
    public HashMap<String, String> cpItems = new HashMap<String, String>();

    private GoogleMap map1;

    private static String TAG = HomeUI.class.getSimpleName();
    private String tag_json_obj = "jobj_req";
    private String tag_json_arry = "jarray_req";
    private String jsonResponse;
    public ArrayList<HashMap<String, String>> carparkList = new ArrayList<HashMap<String, String>>();
    private TextView txtResponse;
    // Google Map
    // private GoogleMap googleMap;

    // Latitude & Longitude
    private Double Latitude = 0.00;
    private Double Longitude = 0.00;

    //From -> the first coordinate from where we need to calculate the distance
    private double fromLongitude;
    private double fromLatitude;

    //To -> the second coordinate to where we need to calculate the distance
    private double toLongitude;
    private double toLatitude;

    //Our buttons
    // private Button direction;
    ScrollView scrollview;
    LinearLayout linearLayout;

    private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        // direction = (Button) findViewById(R.id.direction);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();

        //For Navigation Drawer
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        View header = navigationView.getHeaderView(0);
        nametxtView = (TextView) header.findViewById(R.id.nametxtView);
        nametxtView.setText(UserAccountManager.str_username);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

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

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new AppManager(), "ONE");
        adapter.addFrag(new TrafficIncidentUI(), "TWO");
        adapter.addFrag(new RoadWorksUI(), "THREE");
        adapter.addFrag(new CarparkAvailabilityUI(), "FOUR");
        viewPager.setAdapter(adapter);
    }

    private void setupTabIcons() {
        int[] tabIcons = {
                R.drawable.ic_map,
                R.drawable.ic_traffic,
                R.drawable.ic_roadwork,
                R.drawable.ic_carpark
        };

        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
        tabLayout.getTabAt(3).setIcon(tabIcons[3]);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

    }


    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {

            // return null to display only the icon
            return null;
        }
    }//For Navigation Drawer

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        // Items listed here are from activity_home_drawer.xml
        if (id == R.id.trafficIncident) {

        } else if (id == R.id.roadWorks) {

        } else if (id == R.id.carPark) {
            jsonArrayCarpark();

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        } else {
            //Log out from the page
            Intent backToLogIn = new Intent(this, LoginUI.class);
            // backToLogIn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            // backToLogIn.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            // backToLogIn.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            // backToLogIn.putExtra("key",1);
            startActivity(backToLogIn);
            Toast.makeText(this, "Thank you and see you again :)", Toast.LENGTH_LONG).show();
            // finish();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    private void jsonArrayCarpark() {

        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
                Const.URL_CarparkAvailability, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            String metadata = response.getString("odata.metadata");
                            JSONArray value = response.getJSONArray("value");
                            String carparkID = "";
                            String area = "";
                            String development = "";
                            String location = "";
                            String availableLots = "";
                            String lotType = "";
                            String agency = "";


                            for (int i = 0; i < value.length(); i++) {

                                JSONObject carparkInfo = value.getJSONObject(i);
                                carparkID = carparkInfo.getString("CarParkID");
                                area = carparkInfo.getString("Area");
                                development = carparkInfo.getString("Development");
                                location = carparkInfo.getString("Location");
                                String[] loc = location.split("\\s+");
                                double latitude = Double.parseDouble(loc[0]);
                                double longitude = Double.parseDouble(loc[1]);
                                availableLots = carparkInfo.getString("AvailableLots");
                                lotType = carparkInfo.getString("LotType");
                                agency = carparkInfo.getString("Agency");


                                jsonResponse = "";
                                jsonResponse += "carparkID: " + carparkID + "\n\n";
                                jsonResponse += "Area: " + area + "\n\n";
                                jsonResponse += "Latitude: " + latitude + "\n\n";
                                jsonResponse += "Longitude: " + longitude + "\n\n";
                                jsonResponse += "development: " + development + "\n\n";
                                jsonResponse += "location: " + location + "\n\n";
                                jsonResponse += "availablelots: " + availableLots + "\n\n";
                                jsonResponse += "lotType: " + lotType + "\n\n";
                                jsonResponse += "Agency: " + agency + "\n\n";


                                Toast.makeText(getApplicationContext(), jsonResponse, Toast.LENGTH_SHORT).show();

                                cpItems = new HashMap<>();
                                carparkList = new ArrayList<HashMap<String, String>>();
                                //cpItems.put("CarParkID", carparkID);
                                cpItems.put("Area", area);
                                cpItems.put("Development", development);
                                cpItems.put("Location", location);
                                cpItems.put("Latitude", String.valueOf(latitude));
                                cpItems.put("Longitude", String.valueOf(longitude));
                                cpItems.put("AvailableLots", availableLots);
                                cpItems.put("LotType", lotType);
                                cpItems.put("Agency", agency);
                                Log.v(TAG, "Testinside: E" + cpItems);
                                carparkList.add(cpItems);
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(),
                                    "Error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                AlertDialog.Builder add = new AlertDialog.Builder(HomeUI.this);
                add.setMessage(error.getMessage()).setCancelable(true);
                AlertDialog alert = add.create();
                alert.setTitle("Error!!!");
                alert.show();
            }
        }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("accept", "application/json");
                headers.put("AccountKey", Const.API_DataMall);
                return headers;
            }
        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(jsonObjReq,
                tag_json_obj);


        // Cancelling request
        // ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_obj);
    }

    public ArrayList<HashMap<String, String>> getarraylist() {
        Log.v(TAG, "testgethasmap: E" + carparkList);
        return carparkList;
    }

    public void setHashmap(ArrayList<HashMap<String, String>> carparkList) {
        this.carparkList = carparkList;
        //getarraylist();
        Log.v(TAG, "testsethasmap: E" + carparkList);
    }
}

AppManager 类:

HomeUI ex = new HomeUI();
        hm = ex.getarraylist();
        Log.v(TAG, "testhashmap: E" + hm);

        if(hm!=null)
        {
            for (int i = 0; i < hm.size(); i++) {

                String name = hm.get(i).get("Area").toString();
                latitude = Double.parseDouble(hm.get(i).get("Latitude").toString());
                longitude = Double.parseDouble(hm.get(i).get("Longitude").toString()); 
                MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(name);
                googleMap.addMarker(marker);
            }

        }

更新

目前,我还有一个问题。根据user guide,他们的 API 响应限制为每次调用 500 条记录。 API 获取请求方法是这样的:http://datamall2.mytransport.sg/ltaodataservice/CarParkAvailabilityv2

要获取接下来的 500 条记录,我必须将 $skip 附加到如下所示的 URL:http://datamall2.mytransport.sg/ltaodataservice/CarParkAvailabilityv2?$skip=500

除了多次调用 API 之外,有没有人知道获取所有记录?

【问题讨论】:

    标签: android json google-maps android-studio arraylist


    【解决方案1】:

    在 volley 响应中的 for 循环中删除 carparkList = new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();。 您已经在上面初始化了该变量。

    【讨论】:

    • 啊,是的,我忘了删除它,我还将初始化设置为公共静态,并且该应用程序现在似乎正在运行。感谢您的回复!
    • 嘿@Bineesh,我目前还有另一个问题。你有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2014-10-21
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多