群集在Android中无法正常运行

时间:2015-11-19 06:47:33

标签: android google-maps google-maps-api-3 markerclusterer

我正在使用谷歌地图工具将聚类标记放在一个位置。我能够正确地聚类标记,但有时当我缩小地图时,所有标记和聚类都会消失。此外,我正在使用Web服务获取标记的位置,并且每当地图相机更改时,都会再次调用该Web服务。 这是我完整的地图片段代码

public class FragmentMap extends Fragment implements HttpRequestClass.TaskDelegate, Constants {
MapView mapView;
GoogleMap map;
GPSTracker gps;
AppSharedPreference appSharedPreference;
private SweetAlertDialog pDialouge;
private HttpRequestClass httprequest;
private String name = "";
private ClusterManager<MyItem> mClusterManager;
private ArrayList<LatLongBean> nearByRequestDataBeanArrayList;
Marker marker;
List<MyItem> items = new ArrayList<>();
List<MyItem> clusterItems = new ArrayList<>();
private Cluster<MyItem> clickedCluster;
private MyItem clickedClusterItem;
private LinearLayout lin_map;
Dialog dialog;
HashMap<String, String> markerLocation;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.homepage_mapfragment, container, false);

    nearByRequestDataBeanArrayList = new ArrayList<>();
    mapView = (MapView) v.findViewById(R.id.mapview);
    mapView.onCreate(savedInstanceState);
    pDialouge = new SweetAlertDialog(getActivity(), SweetAlertDialog.PROGRESS_TYPE);
    appSharedPreference = AppSharedPreference.getsharedprefInstance(getActivity());
    appSharedPreference.setRequestOther(false);
    map = mapView.getMap();
    map.getUiSettings().setMyLocationButtonEnabled(true);
    map.setMyLocationEnabled(true);
    MapsInitializer.initialize(getActivity());
    lin_map = (LinearLayout) v.findViewById(R.id.lin_map);
    gps = new GPSTracker(getActivity());
    mClusterManager = new ClusterManager<>(getActivity(), map);
    submitData();

    View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));

    RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
    // position on right bottom
    rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0);
    rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    rlp.setMargins(0, 130, 30, 0);


    if (gps.canGetLocation()) {
        double lat = gps.getLatitude();
        double lon = gps.getLongitude();
        appSharedPreference.setLatitude(String.valueOf(lat));
        appSharedPreference.setLongitude(String.valueOf(lon));
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lon), 13);
        map.animateCamera(cameraUpdate);

    }
    submitData();

    map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            if (marker != null) {
                marker.remove();
                mClusterManager.clearItems();
            }
            LatLng latLng = cameraPosition.target;
            appSharedPreference.setLatitude(String.valueOf(latLng.latitude));
            appSharedPreference.setLongitude(String.valueOf(latLng.longitude));
            float maxZoom = 15.0f;
            if (cameraPosition.zoom > maxZoom)
                map.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
            // marker = map.addMarker(new MarkerOptions().position(latLng));
            submitData();
            pDialouge.hide();

        }
    });

    mClusterManager.setRenderer(new MyClusterRenderer(getActivity(), map, mClusterManager));
    map.setOnMarkerClickListener(mClusterManager);
    mClusterManager
            .setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyItem>() {
                @Override
                public boolean onClusterClick(Cluster<MyItem> cluster) {
                    clickedCluster = cluster;
                    showPopUp(clickedCluster);

                    return false;
                }
            });

/*mClusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<MyItem>() {
    @Override
    public boolean onClusterItemClick(MyItem myItem) {
        Toast.makeText(getActivity(), "Hello", Toast.LENGTH_LONG).show();
        return false;
    }
});*/
    return v;
}


public void showPopUp(Cluster<MyItem> myItemCluster) {
    dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.popup_map);

    ListView lv_cluster = (ListView) dialog.findViewById(R.id.lv_cluster);
    clusterItems.addAll(myItemCluster.getItems());
    ClusterAdapter clusterAdapter = new ClusterAdapter(getActivity(), clusterItems);
    lv_cluster.setAdapter(clusterAdapter);
    dialog.show();
    dialog.setCanceledOnTouchOutside(false);
    dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
            clusterItems.clear();
        }
    });
    lv_cluster.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            dialog.hide();
            Bundle bundle = new Bundle();
            bundle.putSerializable("name", clusterItems.get(position).getName());
            bundle.putSerializable("bloodGroup", clusterItems.get(position).getBloodGroup());
            bundle.putSerializable("units", clusterItems.get(position).getUnits());
            bundle.putSerializable("status", clusterItems.get(position).getStatus());
            bundle.putSerializable("date", clusterItems.get(position).getDate());
            Intent intent = new Intent(getActivity(), ActivityRequestInfoMap.class);
            intent.putExtras(bundle);
            clusterItems.clear();
            startActivity(intent);
        }
    });
    //clusterItems.clear();
}


@Override
public void processFinish(String output, String requestfor) {
    Log.d("output", output);
    parseNearByRequestData(output);
    pDialouge.dismiss();
}


private void submitData() {
    if (!appSharedPreference.getUserId().equals("")) {
        pDialouge.getProgressHelper().setBarColor(Color.parseColor(LOADER_COLOR));
        pDialouge.setTitleText("Loading...");
        pDialouge.setCancelable(false);
        pDialouge.show();
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date today = Calendar.getInstance().getTime();
        String reportDate = df.format(today);
        List<NameValuePair> pdata = new ArrayList<NameValuePair>();
        pdata.add(new BasicNameValuePair("userid", appSharedPreference.getUserId()));
        pdata.add(new BasicNameValuePair("radius", "10"));
        pdata.add(new BasicNameValuePair("lat", appSharedPreference.getLatitude()));
        pdata.add(new BasicNameValuePair("long", appSharedPreference.getLongitude()));
        pdata.add(new BasicNameValuePair("date", reportDate));
        CreateAsyncDataMethod();
        httprequest.RequestFor("profile_update", pdata);
        httprequest.execute(SITE_BASE_URL + "nearby_request.php");
    }
}


public void CreateAsyncDataMethod() {
    httprequest = new HttpRequestClass();
    httprequest.delegate = this;
}


private void parseNearByRequestData(String response) {

    try {
        JSONObject jsonObject = new JSONObject(response);
        int error_code = jsonObject.getInt("error_code");
        float increment = 0.0002f;
        float j = 0.0001f;
        if (error_code == 1) {
            JSONArray jsonArray = jsonObject.getJSONArray("data");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject object = jsonArray.getJSONObject(i);
                String latitude = object.getString("latitude");
                String longitude = object.getString("longitude");
                String location = object.getString("location");
                String status = object.getString("status");
                String name = object.getString("name");
                int units = object.getInt("units");
                String date = object.getString("date_on");
                String bloodRequired = object.getString("blood_required");
                int user_status=object.getInt("user_status");
                double lat = Double.parseDouble(latitude) + increment;
                double lng = Double.parseDouble(longitude) + increment;
                increment = increment + j;
                //String status,String blood_required, String units, String date, String location, int error_code, String latitude, String longitude, String contact_no, int user_id, int request_id, String name) {
                nearByRequestDataBeanArrayList.add(new LatLongBean(lat, lng, name, status, units, bloodRequired, date,user_status));
                items.add(new MyItem(lat, lng, nearByRequestDataBeanArrayList.get(i).getStatus(), nearByRequestDataBeanArrayList.get(i).getUnits(),
                        nearByRequestDataBeanArrayList.get(i).getName(), nearByRequestDataBeanArrayList.get(i).getBloodGroup(), nearByRequestDataBeanArrayList.get(i).getDate(),nearByRequestDataBeanArrayList.get(i).getUser_status()));
                //mClusterManager.addItem(new MyItem(nearByRequestDataBeanArrayList.get(i).getLatitude(),nearByRequestDataBeanArrayList.get(i).getLongitude()));

                // map.setOnCameraChangeListener(mClusterManager);
                // name=location;
                //map.addMarker(new MarkerOptions().position(new LatLng(nearByRequestDataBeanArrayList.get(i).getLatitude(), nearByRequestDataBeanArrayList.get(i).getLongitude())).title(location));
            }

            mClusterManager.clearItems();
            mClusterManager.addItems(items);
            mClusterManager.cluster();
            items.clear();
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

@Override
public void onResume() {
    mapView.onResume();
    super.onResume();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mapView.onDestroy();
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mapView.onLowMemory();
}


class MyClusterRenderer extends DefaultClusterRenderer<MyItem> {
    public MyClusterRenderer(Context context, GoogleMap map,
                             ClusterManager<MyItem> clusterManager) {
        super(context, map, clusterManager);
    }

    @Override
    protected void onBeforeClusterItemRendered(MyItem item,
                                               MarkerOptions markerOptions) {
        super.onBeforeClusterItemRendered(item, markerOptions);


    }

    @Override
    protected void onClusterItemRendered(MyItem clusterItem, Marker marker) {
        super.onClusterItemRendered(clusterItem, marker);
       /* Bitmap icon = mIconGenerator.makeIcon();
        marker.icon(BitmapDescriptorFactory.fromBitmap(icon));*/
    }
}


public class ClusterAdapter extends BaseAdapter {
    Context context;
    LayoutInflater layoutInflater;
    List<MyItem> clusterItem;

    public ClusterAdapter(Context context, List<MyItem> clusterItems) {
        this.context = context;
        this.clusterItem = clusterItems;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.popup_row, parent, false);


            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder = new ViewHolder();
        holder.tv_status = (TextView) convertView.findViewById(R.id.status);
        holder.tv_blood_group = (TextView) convertView.findViewById(R.id.tv_blood_group);
        holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
        holder.lin_row = (LinearLayout) convertView.findViewById(R.id.lin_row);
        holder.tv_name.setText(clusterItem.get(position).getName() + " needs " + clusterItem.get(position).getUnits() + " units");
        holder.tv_status.setText(clusterItem.get(position).getStatus());
        holder.tv_blood_group.setText(clusterItem.get(position).getBloodGroup());
        if (clusterItem.get(position).getStatus().equalsIgnoreCase("Normal")) {
            holder.lin_row.setBackgroundColor(Color.WHITE);
            holder.tv_status.setTextColor(Color.BLACK);
            holder.tv_blood_group.setTextColor(Color.BLACK);
        } else {
            holder.lin_row.setBackgroundColor(Color.parseColor("#A92934"));
            holder.tv_status.setTextColor(Color.WHITE);
            holder.tv_blood_group.setTextColor(Color.WHITE);
        }
        if (clusterItem.get(position).getUserStatus()==1)
        {
            holder.tv_name.setTextColor(Color.parseColor("#008000"));
        }
        return convertView;
    }
}

static class ViewHolder {
    TextView tv_status, tv_name, tv_blood_group;
    LinearLayout lin_row;
}

我无法理解为什么会发生这种情况,有时候会有一个动画显示标记正在添加到群集中,但该动画有时也是重复的。

0 个答案:

没有答案