2020-12-16
前回これすごくいいと騒いでいたpicassoの件です。
設定したマーカーをタップしてpicassoで読み込んだ画像を
表示するまでが期待値だったのですが、
一エリアのマーカーの一回目のタップに必ず
プレースホルダーが表示される現象がおきました。
こちらの原因は、picasso自体参照が弱いため。intoに入れる素材が
imageViewだけだとpicassoが画像を取れなくても
読み込んだ行為=画像を読み込んだと誤認識
してしまうため、デフォルトのプレースホルダーの
画像を表示してしまうみたいです。
正しく使うためには、picassoのコールバックを使う必要があります。
前回書いたコードにinto(ImageView, Callback)を追加します。
</pre> //吹き出しカスタマイズ mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { // 今回はこちらに処理を記述 View view = getLayoutInflater().inflate(R.layout.info_window, null); // タイトル設定 TextView title = (TextView)view.findViewById(R.id.info_title); title.setText(marker.getTitle()); ImageView imageView = (ImageView) view.findViewById(R.id.info_image); Picasso.with(ReportActivity.this) .load(marker.getSnippet()) .placeholder(R.drawable.sandclock) .resize(200,200) .into(imageView,new MarkerCallback(marker,marker.getSnippet(),imageView)); return view; } }); <pre>
ここまでは前回と一緒です。続いてコールバックの実装。
</pre> public class MarkerCallback implements Callback { Marker marker = null; String URL; ImageView userPhoto; MarkerCallback(Marker marker, String URL, ImageView userPhoto) { this.marker = marker; this.URL = URL; this.userPhoto = userPhoto; } @Override public void onError() { //Log.e(getClass().getSimpleName(), "Error loading thumbnail!"); } @Override public void onSuccess() { if (marker != null && marker.isInfoWindowShown()) { marker.hideInfoWindow(); Picasso.with(ReportActivity.this) .load(URL) .into(userPhoto); marker.showInfoWindow(); } } } <pre>
picassoが読み込みに成功したら必ずコールバックで値の更新を
行います。
ここではmarker、URL、userPhoto再度onSuccessで
picassoに渡して更新しています。
これでプレースホルダーが呼ばれることなく読み込んだ画像を
ちゃんと表示してくれるようになりました。
調べてみるとstackoverflowにも似たような記事がありました。
qiitaにも
https://qiita.com/Nkzn/items/a285196a88a21b80b9bf
リファレンスを飛ばしてしまいがちだったのでそのしっぺ返しが
きてしまった感じですね。