我有recyclerView,其中我尝试使用google map lite模式显示每个项目的位置。这是我的RcyclerView适配器的实现:
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);
}
}
}
问题出在 myViewHolder 和 onMapReady , onMapReady 总是在我的列表发布后执行,因此 gMap 在列表更新期间为空。并且 setMapLocation 将无法按预期工作。作为一个结果,我在Recyclerview Item中的MapView始终为空。
我的代码在哪里我做错了?
答案 0 :(得分:0)
我为解决这个问题所做的是:
在onBindViewHolder()中,将ViewHolder tag
的{{1}}设置为您要显示的LatLng。 (即map
)。您可以选择在ViewHolder中使用其他成员变量来临时保存您已经执行过的LatLng值。
当首次通过onCreateViewHolder()创建ViewHolder实例时,它会初始化地图,而onMapReady()会被称为AFTER onBindViewHolder()。现在在map.tag = new LatLng(item.getLat(), item.getLon())
中,使用您在onMapReady()
中设置的LatLng或您之前设置的任何变量。在您的情况下,只需致电map.tag
这应该可以解决您的问题。我受到这个解决方案的启发: https://github.com/androidcodegeeks/android-map_list/tree/master/app/src/main/java/com/example/google/maplist
让我知道它是否有帮助,因为我有同样的问题。