地图标记点图像与毕加索未在第一次加载

时间:2016-03-21 02:50:37

标签: java android google-maps google-maps-markers

我用自定义标记实现了android Mapview。我使用毕加索将图像加载到标记视图中。当我第一次启动应用程序时,它会显示所有标记,但只有一个标记已经从数据库加载了毕加索,其他标记没有从数据库加载,它们只显示默认的地图标记图钉。但是,当我转到上一个活动并返回到MapsActivity时,它会向我显示从毕加索数据库加载的所有标记。

这是我的PicassoMarker课程

public class PicassoMarker implements Target {
Marker mMarker;

    PicassoMarker(Marker marker) {
        mMarker = marker;
    }

    @Override
    public int hashCode() {
        return mMarker.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if(o instanceof PicassoMarker) {
            Marker marker = ((PicassoMarker) o).mMarker;
            return mMarker.equals(marker);
        } else {
            return false;
        }
    }

    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        mMarker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        //mMarker.setIcon(BitmapDescriptorFactory.fromResource(R.mipmap.here));
    }
}

这是MapsActivity中的方法

public void plotMarkers(ArrayList<MyMarker> markers) {
    if(markers.size() > 0) {
        for (MyMarker myMarker : markers)
        {
            markerOption = new MarkerOptions().position(new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()));
            location_marker = mMap.addMarker(markerOption);
            target = new PicassoMarker(location_marker);
            Picasso.with(MapsActivity.this).load(myMarker.getmIcon()).resize(84, 125).into(target);
            mMarkersHashMap.put(location_marker, myMarker);

            i = getIntent();
            if(i.getBooleanExtra("maps", true)) {
                buttonNavigasi.setVisibility(View.VISIBLE);

                location_marker.setTitle(i.getStringExtra("nama"));
                dest = new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude());
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(dest, 16));
            }
            else {
                mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
            }
        }
    }
}

这里出了什么问题?

感谢。

1 个答案:

答案 0 :(得分:1)

好的,所以我设法重现你正在经历的事情并找到导致你问题的原因。在您提供的代码中,请注意MapsActivity中的这一行:

target = new PicassoMarker(location_marker);

我假设您正在为target使用全局单变量。我添加了一些日志并设法看到使用Picasso加载图片的唯一标记是for循环中的 last Marker

原因是,每次进入循环时,target的值都会更改为您拥有的较新 PicassoMarker,从而生成onBitmapLoaded 之前 PicassoMarker 无用,因为它不再有目标。 :(

所以我做的是,我刚刚添加了List<Target>变量(确保您不要忘记初始化)来存储{{1}的实例}秒。在我之前指定的行中,我刚刚添加了代码以将target的值存储到列表中,如下所示:

target

在我的模拟器上测试它并将图像加载到所有Target target = new PicassoMarker(location_marker); targets.add(target); s。

  

修改

以下是我用来重现您的错误然后对其进行修改以使其正常工作的活动代码:

Marker