Java 使用谷歌地图在RecyclerView中绘制路线

Java 使用谷歌地图在RecyclerView中绘制路线,java,android,google-maps,android-recyclerview,Java,Android,Google Maps,Android Recyclerview,我试图用Recycerview在severel google地图中绘制路线,但我不知道为什么第一张地图没有绘制,而另一张地图绘制正确 我用图书馆截击来获取数据 Recycerview: import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawa

我试图用Recycerview在severel google地图中绘制路线,但我不知道为什么第一张地图没有绘制,而另一张地图绘制正确

我用图书馆截击来获取数据

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);
    }
}

导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.drawable.drawable;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.LinearLayout;
导入android.widget.TextView;
导入android.widget.Toast;
导入androidx.annotation.DrawableRes;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.core.content.ContextCompat;
导入androidx.recyclerview.widget.recyclerview;
导入com.directions.route.AbstractRouting;
导入com.directions.route.route;
导入com.directions.route.RouteException;
导入com.directions.route.Routing;
导入com.directions.route.RoutingListener;
导入com.example.crossonme.Dependencias.Alertas.Alerta;
导入com.example.crossonme.Dependencias.DB.EventosItem;
导入com.example.crossonme.Login\u寄存器;
导入com.example.crossonme.R;
导入com.google.android.gms.common.ConnectionResult;
导入com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.MapView;
导入com.google.android.gms.maps.mapsintializer;
导入com.google.android.gms.maps.OnMapReadyCallback;
导入com.google.android.gms.maps.SupportMapFragment;
导入com.google.android.gms.maps.model.BitmapDescriptor;
导入com.google.android.gms.maps.model.BitmapDescriptorFactory;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.MapStyleOptions;
导入com.google.android.gms.maps.model.MarkerOptions;
导入com.google.android.gms.maps.model.Polyline;
导入com.google.android.gms.maps.model.PolylineOptions;
导入com.google.android.material.snackbar.snackbar;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
公共类MyAdapter扩展了RecyclerView。适配器在MapreadyCallback、RoutingListener上实现{
语境;
公共静态ArrayList EventPositeMarrayList=新ArrayList();
私有OnClick mOnClick;
谷歌地图;
地图视图;
int-id,位置;
私有列表多段线=null;
类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
text查看tvNome、tvdescripcao、dtData;
OnClick OnClick;
MyViewHolder(视图视图,OnClick-OnClick){
超级(视图);
tvNome=view.findViewById(R.id.evitem_nome);
tvscripticao=view.findViewById(R.id.evitem_descripcao);
dtData=view.findviewbyd(R.id.evitem_数据);
mMapView=view.findviewbyd(R.id.evitem_map);
this.onClick=onClick;
view.setOnClickListener(这个);
}
@凌驾
公共void onClick(视图v){
onClick.onItemClick(getAdapterPosition());
}
}
公共MyAdapter(ArrayList EventPositeMarrayList,OnClick-OnClick){
this.eventositemaraylist=eventositemaraylist;
this.mOnClick=onClick;
}
@非空
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View-View=LayoutInflater.from(parent.getContext()).flate(R.layout.evento_项,null,true);
context=parent.getContext();
返回新的MyViewHolder(视图,mOnClick);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
位置=位置;
mMapView.onCreate(空);
mMapView.onResume();
findrootes(eventosItemArrayList.get(Position.getcomev(),eventosItemArrayList.get(Position.getFimEv());
Log.e(“标签”,“位置”);
mMapView.getMapAsync(this);
id=EventPositeMarrayList.get(position.getIdEv();
holder.tvNome.setText(eventpositemarraylist.get(position.getnomev());
holder.tvsdescripao.setText(eventpositemarraylist.get(position.getdescripaoev());
holder.dtData.setText(eventpositemarraylist.get(position.getDataEv());
}
@凌驾
public int getItemCount(){
返回EventPositeMarrayList.size();
}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
mMap=谷歌地图;
setMapStyle(MapStyleOptions.loadRawResourceStyle(context,R.raw.map_主题));
葡萄牙拉特宁=新拉特宁(39.399872,-8.224454);
谷歌地图。移动相机(CameraUpdateFactory。newLatLngZoom(葡萄牙,6));
}
公共接口OnClick{
无效单击(内部位置);
}
公共无效数据(LatLng开始、LatLng结束)
{
路由=new Routing.Builder()
.travelMode(AbstractRouting.travelMode.DRIVING)
.withListener(此)
.备选路线(正确)
.航路点(起点、终点)
.key(“AIzaSyDzsi_tYj6jhR2CiPx9g-d7EEc8BRb6N7g”)
.build();
routing.execute();
}
//路由回拨功能。
@凌驾
路由失败时公共无效(路由例外e){
}
@凌驾
在RoutingStart()上公开作废{
}
@凌驾
public void on RoutingSuccess(ArrayList route,int shortestRouteIndex){
PolylineOptions polyOptions=新的PolylineOptions();
LatLng POLYLINEATLNG=null;
LatLng多段线ENDLATLNG=null;
多段线=新的ArrayList();
对于(int i=0;i

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));
    }
}