diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/AGroupedImageListQuestForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/AGroupedImageListQuestForm.kt index f056ed86c9..7e081cde2b 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/AGroupedImageListQuestForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/AGroupedImageListQuestForm.kt @@ -66,11 +66,6 @@ abstract class AGroupedImageListQuestForm : AbstractOsmQuestForm() { binding.list.layoutManager = imageSelector.gridLayoutManager binding.list.isNestedScrollingEnabled = false - binding.showMoreButton.setOnClickListener { - imageSelector.items = allItems - binding.showMoreButton.visibility = View.GONE - } - binding.selectHintLabel.setText(R.string.quest_select_hint_most_specific) imageSelector.listeners.add { checkIsFormComplete() } @@ -82,7 +77,8 @@ abstract class AGroupedImageListQuestForm : AbstractOsmQuestForm() { }) checkIsFormComplete() - imageSelector.items = getInitialItems() + imageSelector.items = getInitialItems() + allItems + binding.list.adapter = imageSelector } diff --git a/app/src/main/java/de/westnordost/streetcomplete/quests/AImageListQuestForm.kt b/app/src/main/java/de/westnordost/streetcomplete/quests/AImageListQuestForm.kt index 98313c7a0e..9704f4eade 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/quests/AImageListQuestForm.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/quests/AImageListQuestForm.kt @@ -84,8 +84,6 @@ abstract class AImageListQuestForm : AbstractOsmQuestForm() { } }) - binding.showMoreButton.visibility = View.GONE - imageSelector.items = moveFavouritesToFront(items) if (savedInstanceState != null) { val selectedIndices = savedInstanceState.getIntegerArrayList(SELECTED_INDICES)!! diff --git a/app/src/main/java/de/westnordost/streetcomplete/view/image_select/GroupedImageSelectAdapter.kt b/app/src/main/java/de/westnordost/streetcomplete/view/image_select/GroupedImageSelectAdapter.kt index 889e411d56..ed5e9dfb64 100644 --- a/app/src/main/java/de/westnordost/streetcomplete/view/image_select/GroupedImageSelectAdapter.kt +++ b/app/src/main/java/de/westnordost/streetcomplete/view/image_select/GroupedImageSelectAdapter.kt @@ -29,7 +29,25 @@ class GroupedImageSelectAdapter(val gridLayoutManager: GridLayoutManager) : var selectedItem: GroupableDisplayItem? = null private set - private val selectedIndex get() = selectedItem?.let { _items.indexOf(it) } ?: -1 + // group is also remembered as item may be appearing + // once outside any groups and again in the group + private var selectedItemGroup: GroupableDisplayItem? = null + + private val selectedIndex: Int get() = + selectedItem?.let { indexOfItemGivenGroupMembership(it, selectedItemGroup) } ?: -1 + + private fun indexOfItemGivenGroupMembership(item: GroupableDisplayItem, group: GroupableDisplayItem?): Int { + var currentGroup: GroupableDisplayItem ? = null + for (i in 0 until _items.size) { + if (_items[i].isGroup) { + currentGroup = _items[i] + } + if (item == _items[i] && group == currentGroup) { + return i + } + } + return -1 + } val listeners = mutableListOf<(GroupableDisplayItem?) -> Unit>() @@ -51,36 +69,36 @@ class GroupedImageSelectAdapter(val gridLayoutManager: GridLayoutManager) : override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { holder.bind(_items[position]) - holder.isSelected = selectedItem?.let { _items.indexOf(it) == position } == true - holder.isGroupExpanded = getGroup(selectedIndex) == position + val selectedIndex = selectedIndex + holder.isSelected = selectedIndex == position + holder.isGroupExpanded = getGroupIndex(selectedIndex) == position } private fun toggle(index: Int) { - val prevSelectedItem = selectedItem - if (selectedItem == null || prevSelectedItem !== _items[index]) { - selectedItem = _items[index] - } else { - selectedItem = null - } - - val selectedItem = selectedItem - if (prevSelectedItem != null) { - val prevSelectedIndex = _items.indexOf(prevSelectedItem) - notifyItemChanged(prevSelectedIndex) - - val previousGroupIndex = getGroup(prevSelectedIndex) - if (previousGroupIndex != -1) { - if (selectedItem == null || previousGroupIndex != getGroup(_items.indexOf(selectedItem))) { + val previousItem = selectedItem + val previousGroup = selectedItemGroup + + val foundGroupIndex = getGroupIndex(index) + selectedItemGroup = if (foundGroupIndex == -1) null else _items[foundGroupIndex] + selectedItem = _items[index] + + if (previousItem != null) { + val previousItemIndex = indexOfItemGivenGroupMembership(previousItem, previousGroup) + val previousGroupIndex = getGroupIndex(previousItemIndex) + notifyItemChanged(previousItemIndex) + if (previousGroup != null) { + if (selectedItem == null || previousGroup != selectedItemGroup) { retractGroup(previousGroupIndex) } } } + val selectedItem = selectedItem if (selectedItem != null) { - val selectedIndex = _items.indexOf(selectedItem) + val selectedIndex = selectedIndex notifyItemChanged(selectedIndex) if (selectedItem.isGroup) { - if (prevSelectedItem == null || getGroup(_items.indexOf(prevSelectedItem)) != selectedIndex) { + if (previousItem == null || previousGroup != selectedItemGroup) { expandGroup(selectedIndex) } } @@ -90,7 +108,7 @@ class GroupedImageSelectAdapter(val gridLayoutManager: GridLayoutManager) : } } - private fun getGroup(index: Int): Int { + private fun getGroupIndex(index: Int): Int { for (i in index downTo 0) { if (_items[i].isGroup) return i } diff --git a/app/src/main/res/layout/cell_labeled_icon_select_with_description.xml b/app/src/main/res/layout/cell_labeled_icon_select_with_description.xml index f50e5615c5..e6642e4691 100644 --- a/app/src/main/res/layout/cell_labeled_icon_select_with_description.xml +++ b/app/src/main/res/layout/cell_labeled_icon_select_with_description.xml @@ -6,6 +6,8 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:padding="4dp" + android:layout_marginTop="1dp" + android:layout_marginBottom="1dp" android:background="@drawable/image_select_cell_rounded"> + + @@ -57,10 +65,4 @@ android:layout_alignParentEnd="true"/> - - diff --git a/app/src/main/res/layout/quest_generic_list.xml b/app/src/main/res/layout/quest_generic_list.xml index bffc477f46..1717c8f905 100644 --- a/app/src/main/res/layout/quest_generic_list.xml +++ b/app/src/main/res/layout/quest_generic_list.xml @@ -24,11 +24,4 @@ android:layout_width="match_parent" android:layout_height="wrap_content"/> -