2016-03-31 17 views
1

MapsViewを実装するアプリを作成しました。マーカーをクリックすると、picassoを使用してデータベースからデータを取得する情報ウィンドウが表示されます。それは正常に動作しますが、問題は、情報ウィンドウの画像が私に必要な画像を表示しないことです。それでもプレースホルダー画像が表示されます。しかし、地図をクリックしてマーカーをもう一度クリックすると、必要な画像が表示されます。しかし、地図をクリックしていない(まだマーカーをクリックしていない)場合は、プレースホルダーマーカーが表示されます。必要な画像を表示するには(プレースホルダ画像が必要な画像に置き換わります)、時間を教えてください。ピカソ付きGoogleマップでinfoWindowで画像を取得する方法 - Android

ここに私のコードは

public void plotMarkers(ArrayList<MyMarker> markers) { 
    if(markers.size() > 0) { 
     for (MyMarker myMarker : markers) 
     { 
      dest = new LatLng(myMarker.getmLatitude(), myMarker.getmLongitude()); 
      markerOption = new MarkerOptions().position(dest); 
      location_marker = mMap.addMarker(markerOption); 
      Target target = new PicassoMarker(location_marker); 
      targets.add(target); 

      ImageView image = new ImageView(this); 
      image.setImageResource(R.mipmap.marker); 
      int width = image.getDrawable().getIntrinsicWidth(); 
      int height = image.getDrawable().getIntrinsicHeight(); 

      Picasso.with(MapsActivity.this).load(myMarker.getmIcon()).resize(width, height).onlyScaleDown().into(target); 
      mMarkersHashMap.put(location_marker, myMarker); 

      i = getIntent(); 
      if(i.getBooleanExtra("maps", true)) { 
       location_marker.setTitle(i.getStringExtra("nama")); 
       mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(dest, 16)); 
      } 
      else { 
       mMap.setInfoWindowAdapter(new MarkerInfoWindowAdapter()); 
      } 
     } 
    } 
} 

public class MarkerInfoWindowAdapter implements GoogleMap.InfoWindowAdapter 
{ 
    @Override 
    public View getInfoWindow(Marker marker) { 
     return null; 
    } 

    @Override 
    public View getInfoContents(Marker marker) { 
     View v = getLayoutInflater().inflate(R.layout.info_windowlayout, null); 

     MyMarker myMarker = mMarkersHashMap.get(marker); 

     TextView markerLabel = (TextView) v.findViewById(R.id.marker_label); 
     markerLabel.setText(myMarker.getmLabel()); 

     ImageView foto = (ImageView) v.findViewById(R.id.foto); 
     Picasso.with(getApplicationContext()).load(myMarker.getmImage()).placeholder(R.layout.progress).error(R.mipmap.error).into(foto); 

     TextView anotherLabel = (TextView) v.findViewById(R.id.another_label); 
     anotherLabel.setText("Baca selengkapnya..."); 

     return v; 
    } 
} 
+0

あなたは[ここ](https://stackoverflow.com/questions/24528482/image-not-loading-from-url-in-custom-infowindow-using-picasso-image-loading-libr)への回答があります。 。 これは素晴らしい解決策ではありませんが、機能します。 –

答えて

8

だ情報ウィンドウは、基本的には人口のビューからキャプチャしたビットマップ、です。その結果、ピッカーのようなビュー—に変更すると、非同期的にImageView —が更新され、情報ウィンドウは更新されません。

ピカソが画像を取得してキャッシュした後にMarkershowInfoWindow()を呼び出すことが1つの解決策です。例えば、this sample appは、情報ウィンドウを取り込むためにピカソを使用し、showInfoWindow()を呼び出すためにピカソCallbackを使用しています。

基本的に
/*** 
    Copyright (c) 2013-2014 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    https://commonsware.com/Android 
*/ 

package com.commonsware.android.mapsv2.imagepopups; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.net.Uri; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import java.util.HashMap; 
import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; 
import com.google.android.gms.maps.model.Marker; 
import com.squareup.picasso.Callback; 
import com.squareup.picasso.Picasso; 

class PopupAdapter implements InfoWindowAdapter { 
    private View popup=null; 
    private LayoutInflater inflater=null; 
    private HashMap<String, Uri> images=null; 
    private Context ctxt=null; 
    private int iconWidth=-1; 
    private int iconHeight=-1; 
    private Marker lastMarker=null; 

    PopupAdapter(Context ctxt, LayoutInflater inflater, 
       HashMap<String, Uri> images) { 
    this.ctxt=ctxt; 
    this.inflater=inflater; 
    this.images=images; 

    iconWidth= 
     ctxt.getResources().getDimensionPixelSize(R.dimen.icon_width); 
    iconHeight= 
     ctxt.getResources().getDimensionPixelSize(R.dimen.icon_height); 
    } 

    @Override 
    public View getInfoWindow(Marker marker) { 
    return(null); 
    } 

    @SuppressLint("InflateParams") 
    @Override 
    public View getInfoContents(Marker marker) { 
    if (popup == null) { 
     popup=inflater.inflate(R.layout.popup, null); 
    } 

    if (lastMarker == null 
     || !lastMarker.getId().equals(marker.getId())) { 
     lastMarker=marker; 

     TextView tv=(TextView)popup.findViewById(R.id.title); 

     tv.setText(marker.getTitle()); 
     tv=(TextView)popup.findViewById(R.id.snippet); 
     tv.setText(marker.getSnippet()); 

     Uri image=images.get(marker.getId()); 
     ImageView icon=(ImageView)popup.findViewById(R.id.icon); 

     if (image == null) { 
     icon.setVisibility(View.GONE); 
     } 
     else { 
     Picasso.with(ctxt).load(image).resize(iconWidth, iconHeight) 
       .centerCrop().noFade() 
       .placeholder(R.drawable.placeholder) 
       .into(icon, new MarkerCallback(marker)); 
     } 
    } 

    return(popup); 
    } 

    static class MarkerCallback implements Callback { 
    Marker marker=null; 

    MarkerCallback(Marker marker) { 
     this.marker=marker; 
    } 

    @Override 
    public void onError() { 
     Log.e(getClass().getSimpleName(), "Error loading thumbnail!"); 
    } 

    @Override 
    public void onSuccess() { 
     if (marker != null && marker.isInfoWindowShown()) { 
     marker.showInfoWindow(); 
     } 
    } 
    } 
} 

、ピカソは、画像を取得するときに、情報ウィンドウはまだ、関連Markerのために開いている場合は、私がshowInfoWindow()呼び出します。ビジュアルエフェクトは、通常のピカソの動作に似ています。プレースホルダ、プレースホルダを置き換える実際のイメージです。

+0

私にコードを教えてもらえますか? コードの編集や追加にはどのコードを使用する必要がありますか? –

+0

大きな説明と例。 –

+0

ありがとうございます。 Picasaの 'callback'を使用しているときに私のために動作します –

関連する問題