From db81ec260ec2c34dd3651bab5aa246500cb48bfd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 13 Dec 2021 21:49:40 +0100 Subject: [PATCH] Recycle View a bit more --- .../room/detail/timeline/item/PollItem.kt | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt index 356298a14a..1308fa49c8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/PollItem.kt @@ -44,7 +44,7 @@ abstract class PollItem : AbsMessageItem() { var totalVotesText: String? = null @EpoxyAttribute - var optionViewStates: List? = null + lateinit var optionViewStates: List override fun bind(holder: Holder) { super.bind(holder) @@ -55,28 +55,22 @@ abstract class PollItem : AbsMessageItem() { holder.questionTextView.text = pollQuestion holder.totalVotesTextView.text = totalVotesText - val cachedViews = mutableMapOf() - holder.optionsContainer.children.filterIsInstance().forEach { existingPollItemView -> - cachedViews[existingPollItemView.getTag(STUB_ID)?.toString() ?: ""] = existingPollItemView + while (holder.optionsContainer.childCount < optionViewStates.size) { + holder.optionsContainer.addView(PollOptionView(holder.view.context)) + } + while (holder.optionsContainer.childCount > optionViewStates.size) { + holder.optionsContainer.removeViewAt(0) } - holder.optionsContainer.removeAllViews() + val views = holder.optionsContainer.children.toList().filterIsInstance() - optionViewStates?.forEachIndexed { index, option -> - val tag = relatedEventId + option.optionId - - val pollOptionItem: PollOptionView = (cachedViews[tag] ?: PollOptionView(holder.view.context)) - .apply { - setTag(STUB_ID, tag) - render( - state = optionViewStates?.getOrNull(index) ?: PollOptionViewState.PollSending(option.optionId, option.optionAnswer) - ) - } - pollOptionItem.setOnClickListener { - callback?.onTimelineItemAction(RoomDetailAction.VoteToPoll(relatedEventId, option.optionId)) + optionViewStates.forEachIndexed { index, optionViewState -> + views.getOrNull(index)?.let { + it.render(optionViewState) + it.setOnClickListener { + callback?.onTimelineItemAction(RoomDetailAction.VoteToPoll(relatedEventId, optionViewState.optionId)) + } } - - holder.optionsContainer.addView(pollOptionItem) } }