使用Picasso加载地图标记点图片时,第一次无法加载。

4

我正在实现带有自定义标记的Android MapView。我使用Picasso将图像加载到标记视图中。当我首次启动应用程序时,它会显示所有标记,但只有一个从数据库中使用Picasso加载的标记,其他标记没有从数据库中加载,它们只显示默认地图标记针。但是当我返回到上一个活动并返回MapsActivity时,它会显示所有从数据库中使用Picasso加载的标记。

这是我的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());
            }
        }
    }
}

这里出了什么问题?
谢谢。

我不是很确定这个问题,因为我无法在我的端上测试它,但你是否尝试在 location_marker = mMap.addMarker(markerOption); 之前调用这些行代码 target = new PicassoMarker(location_marker); Picasso.with(MapsActivity.this).load(myMarker.getmIcon()).resize(84, 125).into(target); - AL.
你能试一下并告诉我它是否有效吗? - AL.
是的,我尝试过了,但是得到了相同的结果。 - Michael Julyus Christopher M.
1个回答

3
好的,我可以帮您翻译成中文。这段内容是关于编程的,涉及到一个叫做MapsActivity的代码文件。请注意该代码文件中的一行代码,代码如下:MapsActivity。我已经复现了您所遇到的问题,并找到了问题的原因。需要注意的是,您提供的代码中存在这样的问题。
target = new PicassoMarker(location_marker);

我假设您正在使用全局单一变量target。我添加了一些日志并成功地看到,使用Picasso加载图像的唯一标记是for循环中的最后一个Marker
原因是每次进入循环时,target的值都会更改为您拥有的较新的PicassoMarker,使得onBitmapLoaded前一个PicassoMarker无用,因为它不再具有目标。 :(
所以我所做的就是添加了一个List<Target>变量(确保不要忘记初始化)来存储target的实例。在我之前指定的那一行中,我只是添加了代码将target的值存储到列表中,如下所示:
Target target = new PicassoMarker(location_marker);
targets.add(target);

我在模拟器上测试过,它可以将图像加载到所有 Marker 上。

编辑

这是我用来重现您的错误的 Activity 代码,并对其进行修改以使其工作的代码:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    Intent i;
    MarkerOptions markerOption;
    List<Target> targets;
    HashMap<Marker, MyMarker> mMarkersHashMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        mMarkersHashMap = new HashMap<>();
        targets = new ArrayList<>();

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        // LatLng sydney = new LatLng(-34, 151);
        // mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        // mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        ArrayList<MyMarker> markers = new ArrayList<MyMarker>();
        MyMarker m1 = new MyMarker(new LatLng(-34, 151.1), "https://developer.chrome.com/extensions/examples/api/idle/idle_simple/sample-128.png");
        MyMarker m2 = new MyMarker(new LatLng(-34, 151.2), "https://developer.chrome.com/extensions/examples/api/idle/idle_simple/sample-128.png");
        MyMarker m3 = new MyMarker(new LatLng(-34, 151.3), "https://developer.chrome.com/extensions/examples/api/idle/idle_simple/sample-128.png");

        markers.add(m1);
        markers.add(m2);
        markers.add(m3);

        plotMarkers(markers);

        mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                Log.d(MapsActivity.class.getSimpleName(), "MARKER Longitude: " + marker.getPosition().longitude);
                return false;
            }
        });
    }

    public void plotMarkers(ArrayList<MyMarker> markers) {
        if (markers.size() > 0) {
            for (MyMarker myMarker : markers) {

                markerOption = new MarkerOptions().position(new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()));
                Marker location_marker = mMap.addMarker(markerOption);

                Target target = new PicassoMarker(location_marker);
                targets.add(target);
                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"));
                    LatLng dest = new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude());
                    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(dest, 8f));
                } else {
                    Log.d(MapsActivity.class.getSimpleName(), "In else{}");
                    // mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter());
                }
            }
        }
    }
}

是的,只有使用 Picasso 加载图像的最后一个 Marker 才会被加载。我尝试添加了一个变量,如下所示:private List<Target> targets; - Michael Julyus Christopher M.
已添加我的活动代码... 我没有更改 PicassoMarker 的任何内容。 - AL.
我应该使用这个变量 private PicassoMarker target; 吗? - Michael Julyus Christopher M.
这是我的onCreate()代码:i = getIntent(); if(i.getBooleanExtra("maps", true)) { mactionBar.setSubtitle(i.getStringExtra("nama")); mMyMarkersArray.add(new MyMarker(i.getStringExtra("nama"), i.getStringExtra("deskripsi"), i.getStringExtra("foto"), i.getStringExtra("marker"), Double.parseDouble(i.getStringExtra("lat")), Double.parseDouble(i.getStringExtra("lng")))); plotMarkers(mMyMarkersArray); }当使用getBooleanExtra("maps", true)时,应用程序崩溃。 - Michael Julyus Christopher M.
如果我发布的回答解决了原始帖子的问题,那基本上就是这样了。你在想什么是另一个问题了。尽量将其作为一个问题发布,并附上详细信息。我相信社区中很多人都愿意帮助你解决问题。如果我有时间,我也会看一下的。;) - AL.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接