0

Ich habe recyclerView in dem ich versuche, jedes Einzelteil Lage zu zeigen, mit Google lite mode.here Karte ist meine Implementierung von RcyclerView Adapter:Google Map Lite-Modus in RecyclerView, OnMapReady nach Liste Update ausführen

public class ItemListAdapter extends RecyclerView.Adapter<ItemListAdapter.MyViewHolder>{ 

    List<ItemListModel> items = new ArrayList<>(); 
    Context context; 

    public ItemListAdapter(Context context) { 
     this.context = context; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.cardview_item,parent, false); 
     return new MyViewHolder(v,context); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
      ItemListModel item = items.get(position); 
      holder.setMapLocation(new LatLng(item.getLat(), item.getLon())); 
    } 

    @Override 
    public int getItemCount() { 
     return items.size(); 
    } 


    @Override 
    public void onViewRecycled(MyViewHolder holder) 
    { 
     // Cleanup MapView here? 
     if (holder.gMap != null) 
     { 
      holder.gMap.clear(); 
      holder.gMap.setMapType(GoogleMap.MAP_TYPE_NONE); 
     } 
    } 
    public void setItmes(List<ItemListModel> items){ 
     this.items.addAll(items); 
     notifyDataSetChanged(); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder implements OnMapReadyCallback{ 

     GoogleMap gMap; 
     MapView map; 
     LatLng mMapLocation; 
     Context context; 

     public MyViewHolder(View itemView,Context context) { 
      super(itemView); 

      map = (MapView) itemView.findViewById(R.id.mapImageView); 
      this.context = context; 
      if (map != null) 
      { 
       map.onCreate(null); 
       map.onResume(); 
       map.getMapAsync(this); 
      } 
     } 

     @Override 
     public void onMapReady(GoogleMap googleMap) { 

      MapsInitializer.initialize(context); 
      gMap = googleMap; 
     } 
     public void setMapLocation(LatLng mapLocation) { 
      mMapLocation = mapLocation; 

      if(gMap != null) { 
       updateMapContents(); 
      } 
     } 
     protected void updateMapContents() { 
      gMap.clear(); 
      gMap.addMarker(new MarkerOptions().position(mMapLocation)); 
      CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(mMapLocation, 15f); 
      gMap.moveCamera(cameraUpdate); 
     } 
    } 

} 

das Problem ist in myViewHolder und in onMapReady, die onMapReady immer ausgeführt werden, nachdem meine Liste und wegen veröffentlicht, dass der GMap während Liste Update null ist. und setMapLocation wird nicht wie erwartet funktionieren. Als Ergebnis ist mein MapView im Recyclerview Item immer leer.

wo in meinem Code mache ich falsch?

+0

Adapter nach Karte bereit machen und dann an Recyclerview binden. –

Antwort

0

Was ich tat, um dieses Problem zu lösen war:

  1. In onBindViewHolder(), die tag Ihrer ViewHolder Besteck map die LatLng Sie zeigen wollen. (d. h. map.tag = new LatLng(item.getLat(), item.getLon())). Sie können wählen, andere Mitgliedsvariablen in Ihrem ViewHolder zu verwenden, um den LatLng-Wert vorübergehend zu speichern, was Sie bereits getan haben.

  2. Wenn die ViewHolder-Instanz zum ersten Mal über onCreateViewHolder() erstellt wird, initialisiert sie die Map und onMapReady() heißt AFTER onBindViewHolder(). Verwenden Sie nun in Ihrer onMapReady() die LatLng, die Sie gerade in der map.tag oder was auch immer Variable gesetzt haben, die Sie von vorher festgelegt haben. In Ihrem Fall rufen Sie einfach

Dies sollte Ihr Problem lösen. Ich wurde von dieser Lösung inspiriert: https://github.com/androidcodegeeks/android-map_list/tree/master/app/src/main/java/com/example/google/maplist

Lassen Sie mich wissen, wenn es hilft, weil ich das gleiche Problem hatte.

Verwandte Themen