问题描述
我正在尝试制作一个用于拖车服务的实时跟踪应用程序。我遵循了Google的教程:https://codelabs.developers.google.com/codelabs/realtime-asset-tracking/index.html?index=..%2F..index#0,该教程使用Firebase实时数据库存储位置。我最终得到了一个应用程序,该应用程序通过标记显示了已注册的拖车服务的位置。之后,我修改了代码以获取当前位置。在地图上显示拖车服务的代码:
private void subscribetoUpdates() {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("TowService");
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot,String prevIoUsChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot,String prevIoUsChildName) {
setMarker(dataSnapshot);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot,String prevIoUsChildName) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError error) {
Log.d(TAG,"Failed to read value.",error.toException());
}
});
}
private void setMarker(DataSnapshot dataSnapshot) {
// When a location update is received,put or update
// its value in mMarkers,which contains all the markers
// for locations received,so that we can build the
// boundaries required to show them all on the map at once
String key = dataSnapshot.getKey();
double lat = Double.parseDouble(dataSnapshot.child("userLocation").child("latitude").getValue().toString());
double lng = Double.parseDouble(dataSnapshot.child("userLocation").child("longitude").getValue().toString());
LatLng location = new LatLng(lat,lng);
// CALculaTING disTANCE FROM CURRENT LOCATION TO MARKER
Location currentLocation = new Location("current");
currentLocation.setLatitude(lastKNownLocation.getLatitude());
currentLocation.setLongitude(lastKNownLocation.getLongitude());
Location towLocation = new Location("notCurrent");
towLocation.setLatitude(lat);
towLocation.setLongitude(lng);
float distance = currentLocation.distanceto(towLocation) / 1000;
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumFractionDigits(2);
if (!mMarkers.containsKey(key)) {
mMarkers.put(key,mMap.addMarker(new MarkerOptions().title(decimalFormat.format(distance) + "KM").position(location)));
} else {
mMarkers.get(key).setPosition(location);
}
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : mMarkers.values()) {
builder.include(marker.getPosition());
}
}
currentLocation是用户的当前位置,而towLocation是我从Firebase实时数据库获得的拖车服务的位置。在这里,我设置标记标题以显示用户与拖车服务之间的距离。所有这些工作正常,但现在我也想在RecyclerView中显示所有拖车服务并显示距离。 TowService类:
public class TowService {
private String towName;
private String towEmail;
private float towdistance;
public TowService() {
}
public TowService(String towName,String towEmail) {
this.towName = towName;
this.towEmail = towEmail;
}
public void setTowName(String towName) {
this.towName = towName;
}
public void setTowEmail(String towEmail) {
this.towEmail = towEmail;
}
public void setTowdistance(float towdistance) {
this.towdistance = towdistance;
}
public String getTowName() {
return towName;
}
public String getTowEmail() {
return towEmail;
}
public float getTowdistance(){
}
}
Tow服务适配器:
public class TowServiceAdapter extends RecyclerView.Adapter<TowServiceAdapter.TowServiceViewHolder> {
private Context mContext;
private List<TowService> mTowServices;
public TowServiceAdapter(Context context,List<TowService> towServices) {
mContext = context;
mTowServices = towServices;
}
@NonNull
@Override
public TowServiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.tow_service_item,parent,false);
return new TowServiceViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull TowServiceViewHolder holder,int position) {
TowService currentTowService = mTowServices.get(position);
holder.towName.setText(currentTowService.getTowName());
holder.towEmail.setText(currentTowService.getTowEmail());
//holder.towdistance.setText(String.valueOf(currentTowService.getTowdistance()));
}
@Override
public int getItemCount() {
return mTowServices.size();
}
public class TowServiceViewHolder extends RecyclerView.ViewHolder {
TextView towName;
TextView towEmail;
TextView towdistance;
public TowServiceViewHolder(@NonNull View itemView) {
super(itemView);
towName = itemView.findViewById(R.id.tow_service_name);
towEmail = itemView.findViewById(R.id.tow_service_email);
towdistance = itemView.findViewById(R.id.tow_service_distance);
}
}
}
我的想法是:在MapsActivity中创建一个函数,该函数将返回距离,然后在 public float getTowdistance()方法中使用该函数,然后再使用 getTowdistance()的结果em>在适配器中,如前所示。但是到目前为止,我尝试过的所有方法都失败了。有人知道我该怎么做吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)