我正在使用谷歌地图工具将聚类标记放在一个位置。我能够正确地聚类标记,但有时当我缩小地图时,所有标记和聚类都会消失。此外,我正在使用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;
}
我无法理解为什么会发生这种情况,有时候会有一个动画显示标记正在添加到群集中,但该动画有时也是重复的。