Anonymous
Адаптер пользовательского информационного окна не загружает изображения в первый раз на карте Google
Сообщение
Anonymous » 26 сен 2024, 17:27
В моем приложении есть карта Google, и на карте показано несколько маркеров. При нажатии на маркеры отображается окно настраиваемой информации.
В окне настраиваемой информации у меня есть несколько изображений для отображения и одно представление переработчика. В этом представлении переработчика также отображаются изображения.
CustomInfoWindowAdapter
Код: Выделить всё
class CustomInfoWindowAdapter(
private val activity: Activity,
private val mRegisteredVenuesDataHome: HomeResponseModel.RegisteredVenuesDataHome.VenuesHome?,
private val click: Click
) : GoogleMap.InfoWindowAdapter {
private lateinit var dialogRestaurantBinding: DialogRestaurantBinding
init {
initializeDialogBinding()
}
private fun initializeDialogBinding() {
dialogRestaurantBinding =
DialogRestaurantBinding.inflate(LayoutInflater.from(activity), null, false)
val gradientDrawable = ContextCompat.getDrawable(
activity,
R.drawable.white_info_window_background_with_no_border
) as GradientDrawable
val bitmap = drawableToBitmap(gradientDrawable, 240)
val roundedBitmap = getRoundedCornerBitmap(bitmap, 20)
dialogRestaurantBinding.rlInfoWindow.background =
BitmapDrawable(dialogRestaurantBinding.root.resources, roundedBitmap)
dialogRestaurantBinding.tvRestaurantName.text =
if (Utils.isNotNull(mRegisteredVenuesDataHome!!.name)) {
mRegisteredVenuesDataHome.name
} else {
""
}
Glide.with(activity)
.asBitmap()
.load(mRegisteredVenuesDataHome.image)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.listener(object : RequestListener {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target,
isFirstResource: Boolean
): Boolean {
return false
}
override fun onResourceReady(
resource: Bitmap,
model: Any,
target: Target?,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
resource.let {
val roundedBitmapImage =
getRoundedCornerBitmap(it, 15)
dialogRestaurantBinding.ivRestaurant.setImageBitmap(roundedBitmapImage)
}
return true
}
})
.into(dialogRestaurantBinding.ivRestaurant)
if (mRegisteredVenuesDataHome.category?.image != null && Utils.isNotNull(
mRegisteredVenuesDataHome.category.image
)
) {
Glide.with(activity)
.load(mRegisteredVenuesDataHome.category.image)
.apply(
RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
)
.into(dialogRestaurantBinding.ivRestaurantType)
} else {
dialogRestaurantBinding.ivRestaurantType.setImageDrawable(
ContextCompat.getDrawable(
activity, R.mipmap.ic_launcher
)
)
}
dialogRestaurantBinding.tvRestaurantType.text =
if (Utils.isNotNull(mRegisteredVenuesDataHome.category!!.name)) {
mRegisteredVenuesDataHome.category.name
} else {
""
}
dialogRestaurantBinding.tvRestaurantDescription.text =
if (Utils.isNotNull(mRegisteredVenuesDataHome.description)) {
mRegisteredVenuesDataHome.description
} else {
""
}
if (mRegisteredVenuesDataHome.checkVenueRegisteredOrNot != null) {
if (mRegisteredVenuesDataHome.checkVenueRegisteredOrNot == 1) {
dialogRestaurantBinding.cvRegisterInterest.setBackgroundResource(R.drawable.registered_background_with_no_border)
dialogRestaurantBinding.tvInterest.text =
activity.getString(R.string.registered_title)
dialogRestaurantBinding.tvInterest.setTextColor(
activity.getColor(R.color.color222222_constant)
)
} else {
dialogRestaurantBinding.cvRegisterInterest.setBackgroundResource(R.drawable.register_interest_background_with_no_border)
dialogRestaurantBinding.tvInterest.text =
activity.getString(R.string.register_interest)
dialogRestaurantBinding.tvInterest.setTextColor(
activity.getColor(R.color.white_constant)
)
}
}
if (mRegisteredVenuesDataHome.territiers!!.isNotEmpty()) {
dialogRestaurantBinding.rvInterestedTerritiers.visibility = View.VISIBLE
dialogRestaurantBinding.rvInterestedTerritiers.layoutManager =
LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
val interestedTerriTiersAdapter = InterestedTerritiersAdapter(
activity,
mRegisteredVenuesDataHome.territiers,
object : Click {
override fun onClick(position: Int, `object`: Any, value: String) {
}
}
)
dialogRestaurantBinding.rvInterestedTerritiers.adapter = interestedTerriTiersAdapter
} else {
dialogRestaurantBinding.rvInterestedTerritiers.visibility = View.GONE
}
if (mRegisteredVenuesDataHome.interestedTerritiers != null && Utils.isNotNull(
mRegisteredVenuesDataHome.interestedTerritiers
)
) {
dialogRestaurantBinding.tvInterestedTerritiersCount.visibility = View.VISIBLE
dialogRestaurantBinding.tvInterestedTerritiersCount.text =
mRegisteredVenuesDataHome.interestedTerritiers.toString()
} else {
dialogRestaurantBinding.tvInterestedTerritiersCount.visibility = View.GONE
}
}
override fun getInfoContents(p0: Marker): View {
return dialogRestaurantBinding.root
}
override fun getInfoWindow(p0: Marker): View {
if (!::dialogRestaurantBinding.isInitialized) {
initializeDialogBinding()
}
dialogRestaurantBinding.cvRegisterInterest.setOnClickListener {
click.onClick(2, " ", " ")
}
return dialogRestaurantBinding.root
}
private fun getRoundedCornerBitmap(bitmap: Bitmap, pixels: Int): Bitmap {
val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(output)
val paint = Paint()
val rect = Rect(0, 0, bitmap.width, bitmap.height)
val rectF = RectF(rect)
val roundPx = pixels.toFloat()
paint.isAntiAlias = true
canvas.drawARGB(0, 0, 0, 0)
paint.color = Color.BLACK
canvas.drawRoundRect(rectF, roundPx, roundPx, paint)
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
canvas.drawBitmap(bitmap, rect, rect, paint)
return output
}
private fun drawableToBitmap(drawable: GradientDrawable, width: Int): Bitmap {
val intrinsicWidth = drawable.intrinsicWidth
val intrinsicHeight = drawable.intrinsicHeight
val height = (width.toFloat() / intrinsicWidth * intrinsicHeight).toInt()
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
return bitmap
}
}
Проблема, с которой я столкнулся, заключается в том, что когда я впервые нажимаю на маркер, изображения внутри информационного окна не загружаются, а также изображения внутри представления переработчика, которые снова внутри информационного окна также не загружаются.
Проблема, с которой я столкнулся, заключается в том, что когда я впервые нажимаю на маркер, изображения внутри информационного окна не загружаются.
Проблема, с которой я столкнулся, заключается в том, что когда я впервые нажимаю на маркер, изображения внутри информационного окна не загружаются, а также изображения внутри представления переработчика, которые снова внутри информационного окна также не загружаются.
p>
Когда я снова нажимаю на маркер, изображения загружаются идеально.
Я хочу загрузить все изображения при первом щелчке по маркеру.< /p>
Код: Выделить всё
mMap!!.setOnMapLoadedCallback {
if (mRegisteredVenuesHomeList!!.isNotEmpty()) {
mRegisteredVenuesHomeList?.forEach { data ->
if (!data.venueSorting.isNullOrEmpty()) {
data.venueSorting.forEach { venueSorting ->
if (venueSorting.name != null && Utils.isNotNull(venueSorting.name) && venueSorting.name.toString()
.equals("popular", true)
) {
val marker =
if (venueSorting.count != null && venueSorting.count > 0) {
addCustomMarker(3, data, venueSorting.count, true)
} else {
addCustomMarker(3, data)
}
val markerData = MarkerData(marker, data)
markerDataList.add(markerData)
}
if (venueSorting.name != null && Utils.isNotNull(venueSorting.name) && venueSorting.name.toString()
.equals("venue_on_spotlight", true)
) {
val marker =
if (venueSorting.count != null && venueSorting.count > 0) {
addCustomMarker(1, data, venueSorting.count, true)
} else {
addCustomMarker(1, data)
}
val markerData = MarkerData(marker, data)
markerDataList.add(markerData)
}
if (venueSorting.name != null && Utils.isNotNull(venueSorting.name) && venueSorting.name.toString()
.equals("discountoffer", true)
) {
val marker =
if (venueSorting.count != null && venueSorting.count > 0) {
addCustomMarker(2, data, venueSorting.count, true)
} else {
addCustomMarker(2, data)
}
val markerData = MarkerData(marker, data)
markerDataList.add(markerData)
}
}
} else {
val marker = addCustomMarker(0, data)
val markerData = MarkerData(marker, data)
markerDataList.add(markerData)
}
}
}
mMap!!.setInfoWindowAdapter(object : GoogleMap.InfoWindowAdapter {
override fun getInfoContents(marker: Marker): View? {
return null
}
override fun getInfoWindow(marker: Marker): View {
val markerData = markerDataList.find { it.marker == marker }
markerData?.let { markerDataUpdate ->
mInterestedTerritiersList!!.clear()
if (markerDataUpdate.data.territiers != null) {
mInterestedTerritiersList!!.addAll(
markerDataUpdate.data.territiers.take(
5
)
)
}
preloadImages()
if (mInterestedTerritiersList != null) {
preloadTerritiersImages(mInterestedTerritiersList!!)
}
return CustomInfoWindowAdapter(
requireActivity(),
markerDataUpdate.data,
object : Click {
override fun onClick(position: Int, `object`: Any, value: String) {
when (position) {
1 -> {
Utils.showLog(
this@MapFragment.javaClass.simpleName, "1"
)
}
2 -> {
Utils.showLog(
this@MapFragment.javaClass.simpleName, "2"
)
}
}
}
}).getInfoWindow(marker)
}
return View(requireContext())
}
})
mMap!!.setOnMarkerClickListener { clickedMarker ->
val markerPosition = clickedMarker.position
val point = mMap!!.projection.toScreenLocation(markerPosition)
val offset = 300
point.y -= offset
val offsetPosition = mMap!!.projection.fromScreenLocation(point)
mMap!!.animateCamera(CameraUpdateFactory.newLatLng(offsetPosition))
clickedMarker.showInfoWindow()
true
}
mMap!!.setOnInfoWindowClickListener { clickedMarker ->
val markerData = markerDataList.find { it.marker == clickedMarker }
markerData?.let { markerDataUpdate ->
val intent = Intent(requireContext(), RestaurantDetailsActivity::class.java)
intent.putExtra(Constant.RESTAURANT_DETAIL, markerDataUpdate.data)
activityLauncher.launch(intent,
object : BetterActivityResult.OnActivityResult {
override fun onActivityResult(result: ActivityResult) {
if (result.resultCode == 101) {
mMap?.let { _ ->
openedInfoWindow?.let { marker ->
marker.showInfoWindow()
openedInfoWindow = null
}
currentLocationMarkerOptions?.let { options ->
mMap!!.addMarker(options)
}
venuesAndOffers()
}
}
}
})
AnimUtils.enterAnimation(requireActivity())
}
}
}
private fun preloadImages() {
for (venue in mRegisteredVenuesHomeList!!) {
venue.image?.let { imageUrl ->
Glide.with(requireActivity()).load(imageUrl).preload()
}
}
}
private fun preloadTerritiersImages(territiersHome: List) {
for (territier in territiersHome) {
// Assuming each territier has an image URL
territier.profileImage!!.name?.let { imageUrl ->
Glide.with(requireActivity()).load(imageUrl).preload()
}
}
}
Пожалуйста, помогите мне с этим.
Подробнее здесь:
https://stackoverflow.com/questions/790 ... google-map
1727360873
Anonymous
В моем приложении есть карта Google, и на карте показано несколько маркеров. При нажатии на маркеры отображается окно настраиваемой информации. В окне настраиваемой информации у меня есть несколько изображений для отображения и одно представление переработчика. В этом представлении переработчика также отображаются изображения. [code] [/code] CustomInfoWindowAdapter [code]class CustomInfoWindowAdapter( private val activity: Activity, private val mRegisteredVenuesDataHome: HomeResponseModel.RegisteredVenuesDataHome.VenuesHome?, private val click: Click ) : GoogleMap.InfoWindowAdapter { private lateinit var dialogRestaurantBinding: DialogRestaurantBinding init { initializeDialogBinding() } private fun initializeDialogBinding() { dialogRestaurantBinding = DialogRestaurantBinding.inflate(LayoutInflater.from(activity), null, false) val gradientDrawable = ContextCompat.getDrawable( activity, R.drawable.white_info_window_background_with_no_border ) as GradientDrawable val bitmap = drawableToBitmap(gradientDrawable, 240) val roundedBitmap = getRoundedCornerBitmap(bitmap, 20) dialogRestaurantBinding.rlInfoWindow.background = BitmapDrawable(dialogRestaurantBinding.root.resources, roundedBitmap) dialogRestaurantBinding.tvRestaurantName.text = if (Utils.isNotNull(mRegisteredVenuesDataHome!!.name)) { mRegisteredVenuesDataHome.name } else { "" } Glide.with(activity) .asBitmap() .load(mRegisteredVenuesDataHome.image) .placeholder(R.mipmap.ic_launcher) .error(R.mipmap.ic_launcher) .listener(object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target, isFirstResource: Boolean ): Boolean { return false } override fun onResourceReady( resource: Bitmap, model: Any, target: Target?, dataSource: DataSource, isFirstResource: Boolean ): Boolean { resource.let { val roundedBitmapImage = getRoundedCornerBitmap(it, 15) dialogRestaurantBinding.ivRestaurant.setImageBitmap(roundedBitmapImage) } return true } }) .into(dialogRestaurantBinding.ivRestaurant) if (mRegisteredVenuesDataHome.category?.image != null && Utils.isNotNull( mRegisteredVenuesDataHome.category.image ) ) { Glide.with(activity) .load(mRegisteredVenuesDataHome.category.image) .apply( RequestOptions() .diskCacheStrategy(DiskCacheStrategy.ALL) .placeholder(R.mipmap.ic_launcher) .error(R.mipmap.ic_launcher) ) .into(dialogRestaurantBinding.ivRestaurantType) } else { dialogRestaurantBinding.ivRestaurantType.setImageDrawable( ContextCompat.getDrawable( activity, R.mipmap.ic_launcher ) ) } dialogRestaurantBinding.tvRestaurantType.text = if (Utils.isNotNull(mRegisteredVenuesDataHome.category!!.name)) { mRegisteredVenuesDataHome.category.name } else { "" } dialogRestaurantBinding.tvRestaurantDescription.text = if (Utils.isNotNull(mRegisteredVenuesDataHome.description)) { mRegisteredVenuesDataHome.description } else { "" } if (mRegisteredVenuesDataHome.checkVenueRegisteredOrNot != null) { if (mRegisteredVenuesDataHome.checkVenueRegisteredOrNot == 1) { dialogRestaurantBinding.cvRegisterInterest.setBackgroundResource(R.drawable.registered_background_with_no_border) dialogRestaurantBinding.tvInterest.text = activity.getString(R.string.registered_title) dialogRestaurantBinding.tvInterest.setTextColor( activity.getColor(R.color.color222222_constant) ) } else { dialogRestaurantBinding.cvRegisterInterest.setBackgroundResource(R.drawable.register_interest_background_with_no_border) dialogRestaurantBinding.tvInterest.text = activity.getString(R.string.register_interest) dialogRestaurantBinding.tvInterest.setTextColor( activity.getColor(R.color.white_constant) ) } } if (mRegisteredVenuesDataHome.territiers!!.isNotEmpty()) { dialogRestaurantBinding.rvInterestedTerritiers.visibility = View.VISIBLE dialogRestaurantBinding.rvInterestedTerritiers.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) val interestedTerriTiersAdapter = InterestedTerritiersAdapter( activity, mRegisteredVenuesDataHome.territiers, object : Click { override fun onClick(position: Int, `object`: Any, value: String) { } } ) dialogRestaurantBinding.rvInterestedTerritiers.adapter = interestedTerriTiersAdapter } else { dialogRestaurantBinding.rvInterestedTerritiers.visibility = View.GONE } if (mRegisteredVenuesDataHome.interestedTerritiers != null && Utils.isNotNull( mRegisteredVenuesDataHome.interestedTerritiers ) ) { dialogRestaurantBinding.tvInterestedTerritiersCount.visibility = View.VISIBLE dialogRestaurantBinding.tvInterestedTerritiersCount.text = mRegisteredVenuesDataHome.interestedTerritiers.toString() } else { dialogRestaurantBinding.tvInterestedTerritiersCount.visibility = View.GONE } } override fun getInfoContents(p0: Marker): View { return dialogRestaurantBinding.root } override fun getInfoWindow(p0: Marker): View { if (!::dialogRestaurantBinding.isInitialized) { initializeDialogBinding() } dialogRestaurantBinding.cvRegisterInterest.setOnClickListener { click.onClick(2, " ", " ") } return dialogRestaurantBinding.root } private fun getRoundedCornerBitmap(bitmap: Bitmap, pixels: Int): Bitmap { val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) val canvas = Canvas(output) val paint = Paint() val rect = Rect(0, 0, bitmap.width, bitmap.height) val rectF = RectF(rect) val roundPx = pixels.toFloat() paint.isAntiAlias = true canvas.drawARGB(0, 0, 0, 0) paint.color = Color.BLACK canvas.drawRoundRect(rectF, roundPx, roundPx, paint) paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN) canvas.drawBitmap(bitmap, rect, rect, paint) return output } private fun drawableToBitmap(drawable: GradientDrawable, width: Int): Bitmap { val intrinsicWidth = drawable.intrinsicWidth val intrinsicHeight = drawable.intrinsicHeight val height = (width.toFloat() / intrinsicWidth * intrinsicHeight).toInt() val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) drawable.setBounds(0, 0, canvas.width, canvas.height) drawable.draw(canvas) return bitmap } } [/code] Проблема, с которой я столкнулся, заключается в том, что когда я впервые нажимаю на маркер, изображения внутри информационного окна не загружаются, а также изображения внутри представления переработчика, которые снова внутри информационного окна также не загружаются. Проблема, с которой я столкнулся, заключается в том, что когда я впервые нажимаю на маркер, изображения внутри информационного окна не загружаются. Проблема, с которой я столкнулся, заключается в том, что когда я впервые нажимаю на маркер, изображения внутри информационного окна не загружаются, а также изображения внутри представления переработчика, которые снова внутри информационного окна также не загружаются. p> Когда я снова нажимаю на маркер, изображения загружаются идеально. Я хочу загрузить все изображения при первом щелчке по маркеру.< /p> [code]mMap!!.setOnMapLoadedCallback { if (mRegisteredVenuesHomeList!!.isNotEmpty()) { mRegisteredVenuesHomeList?.forEach { data -> if (!data.venueSorting.isNullOrEmpty()) { data.venueSorting.forEach { venueSorting -> if (venueSorting.name != null && Utils.isNotNull(venueSorting.name) && venueSorting.name.toString() .equals("popular", true) ) { val marker = if (venueSorting.count != null && venueSorting.count > 0) { addCustomMarker(3, data, venueSorting.count, true) } else { addCustomMarker(3, data) } val markerData = MarkerData(marker, data) markerDataList.add(markerData) } if (venueSorting.name != null && Utils.isNotNull(venueSorting.name) && venueSorting.name.toString() .equals("venue_on_spotlight", true) ) { val marker = if (venueSorting.count != null && venueSorting.count > 0) { addCustomMarker(1, data, venueSorting.count, true) } else { addCustomMarker(1, data) } val markerData = MarkerData(marker, data) markerDataList.add(markerData) } if (venueSorting.name != null && Utils.isNotNull(venueSorting.name) && venueSorting.name.toString() .equals("discountoffer", true) ) { val marker = if (venueSorting.count != null && venueSorting.count > 0) { addCustomMarker(2, data, venueSorting.count, true) } else { addCustomMarker(2, data) } val markerData = MarkerData(marker, data) markerDataList.add(markerData) } } } else { val marker = addCustomMarker(0, data) val markerData = MarkerData(marker, data) markerDataList.add(markerData) } } } mMap!!.setInfoWindowAdapter(object : GoogleMap.InfoWindowAdapter { override fun getInfoContents(marker: Marker): View? { return null } override fun getInfoWindow(marker: Marker): View { val markerData = markerDataList.find { it.marker == marker } markerData?.let { markerDataUpdate -> mInterestedTerritiersList!!.clear() if (markerDataUpdate.data.territiers != null) { mInterestedTerritiersList!!.addAll( markerDataUpdate.data.territiers.take( 5 ) ) } preloadImages() if (mInterestedTerritiersList != null) { preloadTerritiersImages(mInterestedTerritiersList!!) } return CustomInfoWindowAdapter( requireActivity(), markerDataUpdate.data, object : Click { override fun onClick(position: Int, `object`: Any, value: String) { when (position) { 1 -> { Utils.showLog( this@MapFragment.javaClass.simpleName, "1" ) } 2 -> { Utils.showLog( this@MapFragment.javaClass.simpleName, "2" ) } } } }).getInfoWindow(marker) } return View(requireContext()) } }) mMap!!.setOnMarkerClickListener { clickedMarker -> val markerPosition = clickedMarker.position val point = mMap!!.projection.toScreenLocation(markerPosition) val offset = 300 point.y -= offset val offsetPosition = mMap!!.projection.fromScreenLocation(point) mMap!!.animateCamera(CameraUpdateFactory.newLatLng(offsetPosition)) clickedMarker.showInfoWindow() true } mMap!!.setOnInfoWindowClickListener { clickedMarker -> val markerData = markerDataList.find { it.marker == clickedMarker } markerData?.let { markerDataUpdate -> val intent = Intent(requireContext(), RestaurantDetailsActivity::class.java) intent.putExtra(Constant.RESTAURANT_DETAIL, markerDataUpdate.data) activityLauncher.launch(intent, object : BetterActivityResult.OnActivityResult { override fun onActivityResult(result: ActivityResult) { if (result.resultCode == 101) { mMap?.let { _ -> openedInfoWindow?.let { marker -> marker.showInfoWindow() openedInfoWindow = null } currentLocationMarkerOptions?.let { options -> mMap!!.addMarker(options) } venuesAndOffers() } } } }) AnimUtils.enterAnimation(requireActivity()) } } } private fun preloadImages() { for (venue in mRegisteredVenuesHomeList!!) { venue.image?.let { imageUrl -> Glide.with(requireActivity()).load(imageUrl).preload() } } } private fun preloadTerritiersImages(territiersHome: List) { for (territier in territiersHome) { // Assuming each territier has an image URL territier.profileImage!!.name?.let { imageUrl -> Glide.with(requireActivity()).load(imageUrl).preload() } } } [/code] Пожалуйста, помогите мне с этим. Подробнее здесь: [url]https://stackoverflow.com/questions/79027803/custom-info-window-adapter-not-loading-images-on-first-time-in-google-map[/url]