2016-03-21 1 views
2

Я реализую андроид 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()); 
      } 
     } 
    } 
} 

Что происходит здесь не так?

Спасибо.

+0

Я не совсем уверен в этом, так как я не могу проверить это на моем конце, но вы пробовали называть эти строки 'target = new PicassoMarker (location_marker); Picasso.with (MapsActivity.this) .load (myMarker.getmIcon()). Resize (84, 125) .into (target); 'before' location_marker = mMap.addMarker (markerOption);'? –

+0

Можете ли вы попробовать и сказать мне, если это как-то работает ..? –

+0

Да, я пробовал, но я получаю тот же результат. –

ответ

1

Хорошо, поэтому мне удалось воспроизвести то, что вы переживаете, и нашли, что вызвало вашу проблему. В коде вы предусмотрели, обратите внимание на эту строку в MapsActivity:

target = new PicassoMarker(location_marker); 

Я предположил, что вы используете глобальную одну переменную для target. Я добавил несколько журналов и обнаружил, что единственным маркером, который получает изображение, загруженное с использованием Picasso, является последнимMarker в цикле for.

Причины в том, что каждый раз, когда вы входите в цикл, значение target изменений в новойPicassoMarker, что у вас есть, делая onBitmapLoaded из предыдущегоPicassoMarker у вас есть бесполезного, так как он больше не имеет цель. :(

Так что я есть, я просто добавил List<Target> переменную (убедитесь, что вы не забудьте инициализировать его) хранить экземпляры target с. В строке, где, что я указал ранее, Я просто добавил код для сохранения значения target к списку, например, так:.

Target target = new PicassoMarker(location_marker); 
targets.add(target); 

Испытано на моем эмуляторе и загружает изображения всех Marker с

EDIT

Вот код активности я воспроизвести вашу ошибку и затем модифицировать его, чтобы заставить его работать:

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()); 
       } 
      } 
     } 
    } 
} 
+0

Да, только маркер, который получает изображение, загруженное с помощью Picasso, является последним маркером в цикле for. Я попытался добавить переменную как этот 'private List целей;' –

+0

Хорошо. Это сработало? –

+0

Вы также просто создали цель внутри цикла? 'Target target = ....' и не использовать одну глобальную переменную? –