mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
Fix image deselection issue in ImageAdapter to update UI correctly (#6409)
This commit is contained in:
parent
b2341c8d9e
commit
633210dbab
1 changed files with 29 additions and 29 deletions
|
|
@ -165,13 +165,8 @@ class ImageAdapter(
|
||||||
val selectedIndex: Int =
|
val selectedIndex: Int =
|
||||||
if (showAlreadyActionedImages) {
|
if (showAlreadyActionedImages) {
|
||||||
ImageHelper.getIndex(selectedImages, image)
|
ImageHelper.getIndex(selectedImages, image)
|
||||||
|
|
||||||
// Getting selected index when switch is off
|
|
||||||
} else if (actionableImagesMap.size > position) {
|
} else if (actionableImagesMap.size > position) {
|
||||||
ImageHelper
|
ImageHelper.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position])
|
||||||
.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position])
|
|
||||||
|
|
||||||
// For any other case return -1
|
|
||||||
} else {
|
} else {
|
||||||
-1
|
-1
|
||||||
}
|
}
|
||||||
|
|
@ -204,8 +199,6 @@ class ImageAdapter(
|
||||||
uploadingContributionList
|
uploadingContributionList
|
||||||
)
|
)
|
||||||
_isLoadingImages.value = false
|
_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 {
|
} else {
|
||||||
val actionableImages: List<Image> = ArrayList(actionableImagesMap.values)
|
val actionableImages: List<Image> = ArrayList(actionableImagesMap.values)
|
||||||
if (actionableImages.size > position) {
|
if (actionableImages.size > position) {
|
||||||
|
|
@ -217,9 +210,6 @@ class ImageAdapter(
|
||||||
.into(holder.image)
|
.into(holder.image)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If switch is turned off, it just fetches the image from all images without any
|
|
||||||
// further operations
|
|
||||||
} else {
|
} else {
|
||||||
Glide
|
Glide
|
||||||
.with(holder.image)
|
.with(holder.image)
|
||||||
|
|
@ -263,10 +253,6 @@ class ImageAdapter(
|
||||||
// finding next actionable image will start from this position
|
// finding next actionable image will start from this position
|
||||||
if (next > -1) {
|
if (next > -1) {
|
||||||
nextImagePosition = 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)) {
|
if (!actionableImagesMap.containsKey(next)) {
|
||||||
actionableImagesMap[next] = allImages[next]
|
actionableImagesMap[next] = allImages[next]
|
||||||
alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder)
|
alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder)
|
||||||
|
|
@ -280,9 +266,6 @@ class ImageAdapter(
|
||||||
notifyItemInserted(position)
|
notifyItemInserted(position)
|
||||||
notifyItemRangeChanged(position, itemCount + 1)
|
notifyItemRangeChanged(position, itemCount + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If next actionable image is not found, that means searching is
|
|
||||||
// complete till end, and it will stop searching.
|
|
||||||
} else {
|
} else {
|
||||||
reachedEndOfFolder = true
|
reachedEndOfFolder = true
|
||||||
notifyItemRemoved(position)
|
notifyItemRemoved(position)
|
||||||
|
|
@ -296,14 +279,39 @@ class ImageAdapter(
|
||||||
private fun onThumbnailClicked(
|
private fun onThumbnailClicked(
|
||||||
position: Int,
|
position: Int,
|
||||||
holder: ImageViewHolder,
|
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 =
|
val sharedPreferences: SharedPreferences =
|
||||||
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
|
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
|
||||||
val showAlreadyActionedImages =
|
val showAlreadyActionedImages =
|
||||||
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
|
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 (singleSelection) {
|
||||||
|
// If single selection mode, clear previous selection and select only the new one
|
||||||
if (selectedImages.isNotEmpty() && (selectedImages[0] != images[position])) {
|
if (selectedImages.isNotEmpty() && (selectedImages[0] != images[position])) {
|
||||||
val prevIndex = images.indexOf(selectedImages[0])
|
val prevIndex = images.indexOf(selectedImages[0])
|
||||||
selectedImages.clear()
|
selectedImages.clear()
|
||||||
|
|
@ -323,7 +331,8 @@ class ImageAdapter(
|
||||||
numberOfSelectedImagesMarkedAsNotForUpload--
|
numberOfSelectedImagesMarkedAsNotForUpload--
|
||||||
}
|
}
|
||||||
notifyItemChanged(position, ImageUnselected())
|
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 {
|
} else {
|
||||||
val image = images[position]
|
val image = images[position]
|
||||||
scope.launch(ioDispatcher) {
|
scope.launch(ioDispatcher) {
|
||||||
|
|
@ -349,7 +358,6 @@ class ImageAdapter(
|
||||||
}
|
}
|
||||||
selectedImages.add(image)
|
selectedImages.add(image)
|
||||||
notifyItemChanged(position, ImageSelectedOrUpdated())
|
notifyItemChanged(position, ImageSelectedOrUpdated())
|
||||||
|
|
||||||
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
|
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -431,7 +439,6 @@ class ImageAdapter(
|
||||||
} else {
|
} else {
|
||||||
val iterator = actionableImagesMap.entries.iterator()
|
val iterator = actionableImagesMap.entries.iterator()
|
||||||
var index = 0
|
var index = 0
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val entry = iterator.next()
|
val entry = iterator.next()
|
||||||
if (entry.value == image) {
|
if (entry.value == image) {
|
||||||
|
|
@ -459,17 +466,10 @@ class ImageAdapter(
|
||||||
val showAlreadyActionedImages =
|
val showAlreadyActionedImages =
|
||||||
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
|
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
|
||||||
|
|
||||||
// While switch is on initializes the holder with all images size
|
|
||||||
return if (showAlreadyActionedImages) {
|
return if (showAlreadyActionedImages) {
|
||||||
allImages.size
|
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) {
|
} else if (actionableImagesMap.size == allImages.size || reachedEndOfFolder) {
|
||||||
actionableImagesMap.size
|
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 {
|
} else {
|
||||||
actionableImagesMap.size + 1
|
actionableImagesMap.size + 1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue