Fix image deselection issue in ImageAdapter to update UI correctly (#6409)

This commit is contained in:
jagadeesh-18-bot 2025-09-13 17:01:23 +05:30
parent b2341c8d9e
commit 633210dbab

View file

@ -165,13 +165,8 @@ class ImageAdapter(
val selectedIndex: Int =
if (showAlreadyActionedImages) {
ImageHelper.getIndex(selectedImages, image)
// Getting selected index when switch is off
} else if (actionableImagesMap.size > position) {
ImageHelper
.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position])
// For any other case return -1
ImageHelper.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position])
} else {
-1
}
@ -204,8 +199,6 @@ class ImageAdapter(
uploadingContributionList
)
_isLoadingImages.value = false
// If the position is already visited, that means the image is already present
// inside map, so it will fetch the image from the map and load in the holder
} else {
val actionableImages: List<Image> = ArrayList(actionableImagesMap.values)
if (actionableImages.size > position) {
@ -217,9 +210,6 @@ class ImageAdapter(
.into(holder.image)
}
}
// If switch is turned off, it just fetches the image from all images without any
// further operations
} else {
Glide
.with(holder.image)
@ -263,10 +253,6 @@ class ImageAdapter(
// finding next actionable image will start from this position
if (next > -1) {
nextImagePosition = next + 1
// If map doesn't contains the next actionable image, that means it's a
// new actionable image, it will put it to the map as actionable images
// and it will load the new image in the view holder
if (!actionableImagesMap.containsKey(next)) {
actionableImagesMap[next] = allImages[next]
alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder)
@ -280,9 +266,6 @@ class ImageAdapter(
notifyItemInserted(position)
notifyItemRangeChanged(position, itemCount + 1)
}
// If next actionable image is not found, that means searching is
// complete till end, and it will stop searching.
} else {
reachedEndOfFolder = true
notifyItemRemoved(position)
@ -296,14 +279,39 @@ class ImageAdapter(
private fun onThumbnailClicked(
position: Int,
holder: ImageViewHolder,
) {
val sharedPreferences: SharedPreferences =
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
val switchState =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
// While switch is turned off, lets user click on image only if the position is
// added inside map
if (!switchState) {
if (actionableImagesMap.size > position) {
selectOrRemoveImage(holder, position)
}
} else {
selectOrRemoveImage(holder, position)
}
}
/**
* Handle click event on an image, update counter on images.
*/
private fun selectOrRemoveImage(
holder: ImageViewHolder,
position: Int,
) {
val sharedPreferences: SharedPreferences =
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
val showAlreadyActionedImages =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
// Single Selection mode
// Getting clicked index from all images index when show_already_actioned_images
// switch is on
if (singleSelection) {
// If single selection mode, clear previous selection and select only the new one
if (selectedImages.isNotEmpty() && (selectedImages[0] != images[position])) {
val prevIndex = images.indexOf(selectedImages[0])
selectedImages.clear()
@ -323,7 +331,8 @@ class ImageAdapter(
numberOfSelectedImagesMarkedAsNotForUpload--
}
notifyItemChanged(position, ImageUnselected())
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) // Added this line to notify the activity
// Notify listener of deselection to update UI
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
} else {
val image = images[position]
scope.launch(ioDispatcher) {
@ -349,7 +358,6 @@ class ImageAdapter(
}
selectedImages.add(image)
notifyItemChanged(position, ImageSelectedOrUpdated())
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
}
}
@ -431,7 +439,6 @@ class ImageAdapter(
} else {
val iterator = actionableImagesMap.entries.iterator()
var index = 0
while (iterator.hasNext()) {
val entry = iterator.next()
if (entry.value == image) {
@ -459,17 +466,10 @@ class ImageAdapter(
val showAlreadyActionedImages =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
// While switch is on initializes the holder with all images size
return if (showAlreadyActionedImages) {
allImages.size
// While switch is off and searching for next actionable has ended, initializes the holder
// with size of all actionable images
} else if (actionableImagesMap.size == allImages.size || reachedEndOfFolder) {
actionableImagesMap.size
// While switch is off, initializes the holder with and extra view holder so that finding
// and addition of the next actionable image in the adapter can be continued
} else {
actionableImagesMap.size + 1
}