我´我试图在severel谷歌Map上用Recycerview画一条路线,但我不知道为什么´在第一张Map上画不出来,但在另一张Map上画得正确。
我´我用图书馆截击来获取数据。
Recycerview公司:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.directions.route.AbstractRouting;
import com.directions.route.Route;
import com.directions.route.RouteException;
import com.directions.route.Routing;
import com.directions.route.RoutingListener;
import com.example.crossonme.Dependencias.Alertas.Alerta;
import com.example.crossonme.Dependencias.DB.EventosItem;
import com.example.crossonme.Login_Register;
import com.example.crossonme.R;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements OnMapReadyCallback, RoutingListener{
Context context;
public static ArrayList<EventosItem> eventosItemArrayList = new ArrayList<>();
private OnClick mOnClick;
GoogleMap mMap;
MapView mMapView;
int id, Position;
private List<Polyline> polylines = null;
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvNome, tvDescricao, dtData;
OnClick onClick;
MyViewHolder(View view, OnClick onClick) {
super(view);
tvNome = view.findViewById(R.id.evitem_nome);
tvDescricao = view.findViewById(R.id.evitem_descricao);
dtData = view.findViewById(R.id.evitem_data);
mMapView = view.findViewById(R.id.evitem_map);
this.onClick = onClick;
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
onClick.onItemClick(getAdapterPosition());
}
}
public MyAdapter(ArrayList<EventosItem> eventosItemArrayList, OnClick onClick) {
this.eventosItemArrayList = eventosItemArrayList;
this.mOnClick = onClick;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.evento_item, null, true);
context = parent.getContext();
return new MyViewHolder(view, mOnClick);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Position = position;
mMapView.onCreate(null );
mMapView.onResume();
Findroutes(eventosItemArrayList.get(Position).getComecoEv(), eventosItemArrayList.get(Position).getFimEv());
Log.e("TAG", ""+ Position );
mMapView.getMapAsync(this);
id = eventosItemArrayList.get(position).getIdEv();
holder.tvNome.setText(eventosItemArrayList.get(position).getNomeEv());
holder.tvDescricao.setText(eventosItemArrayList.get(position).getDescricaoEv());
holder.dtData.setText(eventosItemArrayList.get(position).getDataEv());
}
@Override
public int getItemCount() {
return eventosItemArrayList.size();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap= googleMap;
googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(context, R.raw.map_theme));
LatLng Portugal = new LatLng(39.399872, -8.224454);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(Portugal, 6));
}
public interface OnClick{
void onItemClick(int position);
}
public void Findroutes(LatLng Start, LatLng End)
{
Routing routing = new Routing.Builder()
.travelMode(AbstractRouting.TravelMode.DRIVING)
.withListener(this)
.alternativeRoutes(true)
.waypoints(Start, End)
.key("AIzaSyDzsi_tYj6jhR2CiPx9g-d7EEc8BRb6N7g")
.build();
routing.execute();
}
//Routing call back functions.
@Override
public void onRoutingFailure(RouteException e) {
}
@Override
public void onRoutingStart() {
}
@Override
public void onRoutingSuccess(ArrayList<Route> route, int shortestRouteIndex) {
PolylineOptions polyOptions = new PolylineOptions();
LatLng polylineStartLatLng=null;
LatLng polylineEndLatLng=null;
polylines = new ArrayList<>();
for (int i = 0; i <route.size(); i++) {
if(i==shortestRouteIndex)
{
polyOptions.color(Color.parseColor("#FF8E06"));
polyOptions.width(10);
polyOptions.addAll(route.get(shortestRouteIndex).getPoints());
Polyline polyline = mMap.addPolyline(polyOptions);
polylineStartLatLng=polyline.getPoints().get(0);
int k=polyline.getPoints().size();
polylineEndLatLng=polyline.getPoints().get(k-1);
polylines.add(polyline);
}
}
MarkerOptions endMarker = new MarkerOptions();
endMarker.position(polylineEndLatLng);
endMarker.title("Destino");
endMarker.icon(bitmapDescriptorFromVector(context, R.drawable.dt_fim));
mMap.addMarker(endMarker);
MarkerOptions beginMarker = new MarkerOptions();
beginMarker.position(polylineStartLatLng);
beginMarker.title("Inicio");
beginMarker.icon(bitmapDescriptorFromVector(context, R.drawable.dt_inicio));
mMap.addMarker(beginMarker);
}
@Override
public void onRoutingCancelled() {
}
private BitmapDescriptor bitmapDescriptorFromVector(Context context, @DrawableRes int vectorDrawableResourceId) {
Drawable vectorDrawable = ContextCompat.getDrawable(context, vectorDrawableResourceId);
vectorDrawable.setBounds(0, 0, vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight());
Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
vectorDrawable.draw(canvas);
return BitmapDescriptorFactory.fromBitmap(bitmap);
}
}
主要活动
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
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.StringRequest;
import com.example.crossonme.Dependencias.Alertas.Alerta;
import com.example.crossonme.Dependencias.DB.EventosItem;
import com.example.crossonme.Dependencias.DB.SharedPrefManager;
import com.example.crossonme.Dependencias.DB.URLs;
import com.example.crossonme.Dependencias.DB.User;
import com.example.crossonme.Dependencias.DB.VolleySingleton;
import com.example.crossonme.Dependencias.MyAdapter;
import com.example.crossonme.R;
import com.google.android.gms.maps.model.LatLng;
import com.google.gson.JsonObject;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Eventos extends android.app.Activity implements View.OnClickListener, MyAdapter.OnClick
{
public static ArrayList<EventosItem> eventosItemArrayList = new ArrayList<>();
EventosItem eventosItem;
LatLng Inicio, Fim;
MyAdapter adapter;
@Override
public void onCreate(android.os.Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.eventos);
eventosItemArrayList.clear();
adapter = new MyAdapter(eventosItemArrayList, this);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.ev_ScrollAtual);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setNestedScrollingEnabled(true);
StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_EVENTOS,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
//converting response to json object
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++){
JSONObject object = array.getJSONObject(i);
String[] latlongIni = object.getString("comeco").split(",");
String[] latlongFim = object.getString("fim").split(",");
Inicio = new LatLng(Double.parseDouble(latlongIni[0]), Double.parseDouble(latlongIni[1]));
Fim = new LatLng(Double.parseDouble(latlongFim[0]), Double.parseDouble(latlongFim[1]));
eventosItem = new EventosItem(object.getString("nome"), object.getString("tipo"),object.getString("descricao"),object.getString("nome_empresa"),object.getInt("id"),object.getString("data"),Inicio,Fim);
eventosItemArrayList.add(eventosItem);
adapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
new Alerta.MensagemAlerta(Eventos.this, "Erro", error.getMessage());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
return params;
}
};
VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);
}
@Override
public void onClick(View v) {
}
@Override
public void onItemClick(int position) {
new Alerta.MensagemAlerta(Eventos.this, "Erro", String.valueOf(position));
}
}
这是一个项目,我尝试了几件事,但没有帮助。我希望有人能帮助我。
大卫
暂无答案!
目前还没有任何答案,快来回答吧!