From 15cb8b6f12069a8c1559a4a92f6b3311df6da03c Mon Sep 17 00:00:00 2001 From: ki960213 Date: Wed, 7 Feb 2024 17:13:39 +0900 Subject: [PATCH 1/5] =?UTF-8?q?chore(build.gradle.kts):=20RecyclerViewPrel?= =?UTF-8?q?oader=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/2023-emmsale/app/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/android/2023-emmsale/app/build.gradle.kts b/android/2023-emmsale/app/build.gradle.kts index 0f9ae95ea..70b11740c 100644 --- a/android/2023-emmsale/app/build.gradle.kts +++ b/android/2023-emmsale/app/build.gradle.kts @@ -127,6 +127,7 @@ dependencies { // Glide implementation("com.github.bumptech.glide:glide:4.15.1") + implementation("com.github.bumptech.glide:recyclerview-integration:4.15.1") // SwipeRefresh implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") From d914822aa6a82d7f4af5fe18364b453197d4e042 Mon Sep 17 00:00:00 2001 From: ki960213 Date: Wed, 7 Feb 2024 17:23:08 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat(ConferenceFragment):=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EB=B3=80=EA=B2=BD=20=EC=8B=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=9C=84=EC=B9=98=20=EC=9C=A0=EC=A7=80=20=EB=B0=8F?= =?UTF-8?q?=20RecyclerViewPreloader=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20preload=20=EC=84=B1=EB=8A=A5=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/conferenceList/ConferenceFragment.kt | 38 +++++++++++- .../ConferenceRecyclerViewAdapter.kt | 59 +++++++++++++------ .../recyclerView/ConferenceViewHolder.kt | 4 ++ 3 files changed, 81 insertions(+), 20 deletions(-) diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt index 95c575af2..6a310bd88 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt @@ -5,6 +5,8 @@ import android.os.Bundle import android.view.View import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager import com.emmsale.R import com.emmsale.data.model.Event import com.emmsale.databinding.FragmentConferenceBinding @@ -19,13 +21,21 @@ import com.emmsale.presentation.ui.conferenceList.uiState.ConferenceSelectedFilt import com.emmsale.presentation.ui.conferenceList.uiState.ConferenceSelectedFilteringOptionUiState import com.emmsale.presentation.ui.eventDetail.EventDetailActivity import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.time.LocalDate @AndroidEntryPoint class ConferenceFragment : BaseFragment(R.layout.fragment_conference) { private val viewModel: ConferenceViewModel by viewModels() - private val eventAdapter by lazy { ConferenceRecyclerViewAdapter(::navigateToEventDetail) } + private val eventAdapter by lazy { + ConferenceRecyclerViewAdapter( + fragment = this, + onClickConference = ::navigateToEventDetail, + onPreloaderReady = { binding.rvEvents.addOnScrollListener(it) }, + ) + } private val filterActivityLauncher = registerForActivityResult(StartActivityForResult()) { result -> if (result == null || result.resultCode != RESULT_OK) return@registerForActivityResult @@ -54,6 +64,16 @@ class ConferenceFragment : BaseFragment(R.layout.frag initView() setupEventsObserver() setupFiltersObserver() + + if (savedInstanceState != null) { + val index = savedInstanceState.getInt(STATE_POSITION_INDEX) + val offset = savedInstanceState.getInt(STATE_POSITION_OFFSET) + val layoutManager = binding.rvEvents.layoutManager as LinearLayoutManager + lifecycleScope.launch { + delay(DELAY_RECYCLER_VIEW_ITEM_READY) + layoutManager.scrollToPositionWithOffset(index, offset) + } + } } private fun initView() { @@ -148,4 +168,20 @@ class ConferenceFragment : BaseFragment(R.layout.frag ) filterActivityLauncher.launch(filterActivityIntent) } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + val layoutManager = binding.rvEvents.layoutManager as LinearLayoutManager + val index = layoutManager.findFirstVisibleItemPosition() + val topView = binding.rvEvents.getChildAt(0) + val offset = topView.top + outState.putInt(STATE_POSITION_INDEX, index) + outState.putInt(STATE_POSITION_OFFSET, offset) + } + + companion object { + private const val STATE_POSITION_INDEX = "STATE_POSITION_INDEX" + private const val STATE_POSITION_OFFSET = "STATE_POSITION_OFFSET" + private const val DELAY_RECYCLER_VIEW_ITEM_READY = 300L + } } diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt index 1e96a6f3c..91eff370b 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt @@ -1,41 +1,62 @@ package com.emmsale.presentation.ui.conferenceList.recyclerView -import android.content.Context +import android.graphics.drawable.Drawable import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.recyclerview.widget.ListAdapter import com.bumptech.glide.Glide +import com.bumptech.glide.ListPreloader.PreloadModelProvider +import com.bumptech.glide.RequestBuilder +import com.bumptech.glide.RequestManager +import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader +import com.bumptech.glide.load.resource.bitmap.CenterCrop +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.util.ViewPreloadSizeProvider import com.emmsale.data.model.Event +import com.emmsale.presentation.common.extension.dp class ConferenceRecyclerViewAdapter( + private val fragment: Fragment, private val onClickConference: (Event) -> Unit, -) : ListAdapter(EventDiffUtil) { + private val onPreloaderReady: (preloader: RecyclerViewPreloader) -> Unit, +) : ListAdapter(EventDiffUtil), PreloadModelProvider { + + private var isFirstPreloader: Boolean = true + + private val requestManager: RequestManager = Glide.with(fragment) + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, - ): ConferenceViewHolder = ConferenceViewHolder(parent, onClickConference) - - override fun getItemCount(): Int = currentList.size + ): ConferenceViewHolder = ConferenceViewHolder( + parent = parent, + onClickConference = onClickConference, + onEventPosterPreDraw = { view -> + if (isFirstPreloader) { + isFirstPreloader = false + val preloader = RecyclerViewPreloader( + fragment, + this, + ViewPreloadSizeProvider(view), + MAX_PRELOAD, + ) + onPreloaderReady(preloader) + } + }, + ) override fun onBindViewHolder(holder: ConferenceViewHolder, position: Int) { holder.bind(getItem(position)) - preload(holder.itemView.context, position) } - private fun preload(context: Context, currentPosition: Int) { - val endPosition = (currentPosition + PRELOAD_SIZE).coerceAtMost(currentList.size - 1) + override fun getPreloadItems(position: Int): MutableList = + mutableListOf(getItem(position)) - currentList - .subList(currentPosition, endPosition) - .forEach { event -> preload(context, event.posterImageUrl) } - } - - private fun preload(context: Context, url: String?) { - Glide.with(context) - .load(url) - .preload() - } + override fun getPreloadRequestBuilder(event: Event): RequestBuilder = requestManager + .load(event.posterImageUrl) + .transform(CenterCrop(), RoundedCorners(15.dp)) companion object { - private const val PRELOAD_SIZE = 8 + private const val MAX_PRELOAD = 8 } } diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt index 327109e8f..de2918bf0 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt @@ -1,7 +1,9 @@ package com.emmsale.presentation.ui.conferenceList.recyclerView import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.core.view.doOnPreDraw import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.emmsale.R import com.emmsale.data.model.Event @@ -10,6 +12,7 @@ import com.emmsale.databinding.ItemConferenceBinding class ConferenceViewHolder( parent: ViewGroup, onClickConference: (Event) -> Unit, + onEventPosterPreDraw: (View) -> Unit, ) : ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.item_conference, parent, false), ) { @@ -17,6 +20,7 @@ class ConferenceViewHolder( init { binding.onClickConference = onClickConference + binding.ivEventPoster.doOnPreDraw { onEventPosterPreDraw(it) } } fun bind(event: Event) { From 5e5f8bfa126c7169bf94a1933b3e0c73048c0288 Mon Sep 17 00:00:00 2001 From: ki960213 Date: Wed, 7 Feb 2024 17:55:40 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor(item=5Fconference.xml):=20item=5Fe?= =?UTF-8?q?vent.xml=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/conferenceList/ConferenceFragment.kt | 4 ++-- ...RecyclerViewAdapter.kt => EventRecyclerViewAdapter.kt} | 8 ++++---- .../{ConferenceViewHolder.kt => EventViewHolder.kt} | 8 ++++---- .../presentation/ui/eventSearch/EventSearchActivity.kt | 8 +------- .../recyclerView/eventSearch/EventSearchViewHolder.kt | 6 +++--- .../app/src/main/res/layout/activity_event_search.xml | 2 +- .../app/src/main/res/layout/fragment_conference.xml | 2 +- .../app/src/main/res/layout/fragment_scrapped_event.xml | 2 +- .../res/layout/{item_conference.xml => item_event.xml} | 0 9 files changed, 17 insertions(+), 23 deletions(-) rename android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/{ConferenceRecyclerViewAdapter.kt => EventRecyclerViewAdapter.kt} (88%) rename android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/{ConferenceViewHolder.kt => EventViewHolder.kt} (73%) rename android/2023-emmsale/app/src/main/res/layout/{item_conference.xml => item_event.xml} (100%) diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt index 6a310bd88..13066bb2d 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt @@ -16,7 +16,7 @@ import com.emmsale.presentation.common.extension.getSerializableExtraCompat import com.emmsale.presentation.common.views.FilterTag import com.emmsale.presentation.common.views.filterChipOf import com.emmsale.presentation.ui.conferenceFilter.ConferenceFilterActivity -import com.emmsale.presentation.ui.conferenceList.recyclerView.ConferenceRecyclerViewAdapter +import com.emmsale.presentation.ui.conferenceList.recyclerView.EventRecyclerViewAdapter import com.emmsale.presentation.ui.conferenceList.uiState.ConferenceSelectedFilteringDateOptionUiState import com.emmsale.presentation.ui.conferenceList.uiState.ConferenceSelectedFilteringOptionUiState import com.emmsale.presentation.ui.eventDetail.EventDetailActivity @@ -30,7 +30,7 @@ class ConferenceFragment : BaseFragment(R.layout.frag private val viewModel: ConferenceViewModel by viewModels() private val eventAdapter by lazy { - ConferenceRecyclerViewAdapter( + EventRecyclerViewAdapter( fragment = this, onClickConference = ::navigateToEventDetail, onPreloaderReady = { binding.rvEvents.addOnScrollListener(it) }, diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/EventRecyclerViewAdapter.kt similarity index 88% rename from android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt rename to android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/EventRecyclerViewAdapter.kt index 91eff370b..5b3dd14f8 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceRecyclerViewAdapter.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/EventRecyclerViewAdapter.kt @@ -15,11 +15,11 @@ import com.bumptech.glide.util.ViewPreloadSizeProvider import com.emmsale.data.model.Event import com.emmsale.presentation.common.extension.dp -class ConferenceRecyclerViewAdapter( +class EventRecyclerViewAdapter( private val fragment: Fragment, private val onClickConference: (Event) -> Unit, private val onPreloaderReady: (preloader: RecyclerViewPreloader) -> Unit, -) : ListAdapter(EventDiffUtil), PreloadModelProvider { +) : ListAdapter(EventDiffUtil), PreloadModelProvider { private var isFirstPreloader: Boolean = true @@ -28,7 +28,7 @@ class ConferenceRecyclerViewAdapter( override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, - ): ConferenceViewHolder = ConferenceViewHolder( + ): EventViewHolder = EventViewHolder( parent = parent, onClickConference = onClickConference, onEventPosterPreDraw = { view -> @@ -45,7 +45,7 @@ class ConferenceRecyclerViewAdapter( }, ) - override fun onBindViewHolder(holder: ConferenceViewHolder, position: Int) { + override fun onBindViewHolder(holder: EventViewHolder, position: Int) { holder.bind(getItem(position)) } diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/EventViewHolder.kt similarity index 73% rename from android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt rename to android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/EventViewHolder.kt index de2918bf0..a9a269c77 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/ConferenceViewHolder.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/recyclerView/EventViewHolder.kt @@ -7,16 +7,16 @@ import androidx.core.view.doOnPreDraw import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.emmsale.R import com.emmsale.data.model.Event -import com.emmsale.databinding.ItemConferenceBinding +import com.emmsale.databinding.ItemEventBinding -class ConferenceViewHolder( +class EventViewHolder( parent: ViewGroup, onClickConference: (Event) -> Unit, onEventPosterPreDraw: (View) -> Unit, ) : ViewHolder( - LayoutInflater.from(parent.context).inflate(R.layout.item_conference, parent, false), + LayoutInflater.from(parent.context).inflate(R.layout.item_event, parent, false), ) { - private val binding = ItemConferenceBinding.bind(itemView) + private val binding = ItemEventBinding.bind(itemView) init { binding.onClickConference = onClickConference diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/EventSearchActivity.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/EventSearchActivity.kt index de2b236ad..a97652d6c 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/EventSearchActivity.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/EventSearchActivity.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import androidx.recyclerview.widget.DividerItemDecoration import com.emmsale.R import com.emmsale.databinding.ActivityEventSearchBinding import com.emmsale.presentation.common.views.ConfirmDialog @@ -50,12 +49,7 @@ class EventSearchActivity : AppCompatActivity() { } private fun setupSearchResultRecyclerView() { - with(binding.rvEventSearchResult) { - adapter = eventSearchAdapter - addItemDecoration( - DividerItemDecoration(this@EventSearchActivity, DividerItemDecoration.VERTICAL), - ) - } + binding.rvEventSearchResult.adapter = eventSearchAdapter } private fun setupSearchHistoryRecyclerView() { diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/recyclerView/eventSearch/EventSearchViewHolder.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/recyclerView/eventSearch/EventSearchViewHolder.kt index 295b6e575..62ab6fe1c 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/recyclerView/eventSearch/EventSearchViewHolder.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/eventSearch/recyclerView/eventSearch/EventSearchViewHolder.kt @@ -5,15 +5,15 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.emmsale.R import com.emmsale.data.model.Event -import com.emmsale.databinding.ItemConferenceBinding +import com.emmsale.databinding.ItemEventBinding class EventSearchViewHolder( parent: ViewGroup, onEventClick: (event: Event) -> Unit, ) : RecyclerView.ViewHolder( - LayoutInflater.from(parent.context).inflate(R.layout.item_conference, parent, false), + LayoutInflater.from(parent.context).inflate(R.layout.item_event, parent, false), ) { - private val binding = ItemConferenceBinding.bind(itemView) + private val binding = ItemEventBinding.bind(itemView) init { binding.onClickConference = onEventClick diff --git a/android/2023-emmsale/app/src/main/res/layout/activity_event_search.xml b/android/2023-emmsale/app/src/main/res/layout/activity_event_search.xml index 620bf4b64..e1c3d56cd 100644 --- a/android/2023-emmsale/app/src/main/res/layout/activity_event_search.xml +++ b/android/2023-emmsale/app/src/main/res/layout/activity_event_search.xml @@ -146,7 +146,7 @@ app:layout_constraintTop_toBottomOf="@id/divider" app:spanCount="@integer/event_search_column_size" app:visible="@{!etEventSearch.text.toString().isBlank()}" - tools:listitem="@layout/item_conference" + tools:listitem="@layout/item_event" tools:visibility="gone" /> + tools:listitem="@layout/item_event" /> + tools:listitem="@layout/item_event" /> Date: Wed, 7 Feb 2024 17:57:53 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix(ConferenceFragment):=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EB=B3=80=EA=B2=BD=20=EC=8B=9C=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EC=9C=A0=EC=A7=80=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ViewPager가 구성 변경 시 프래그먼트를 Resumed 상태로 안바꿔줘서 뷰 참조하면 null이라 에러 뜸 --- .../ui/conferenceList/ConferenceFragment.kt | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt index 13066bb2d..2f99cfb3f 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt @@ -5,8 +5,6 @@ import android.os.Bundle import android.view.View import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.fragment.app.viewModels -import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.LinearLayoutManager import com.emmsale.R import com.emmsale.data.model.Event import com.emmsale.databinding.FragmentConferenceBinding @@ -21,8 +19,6 @@ import com.emmsale.presentation.ui.conferenceList.uiState.ConferenceSelectedFilt import com.emmsale.presentation.ui.conferenceList.uiState.ConferenceSelectedFilteringOptionUiState import com.emmsale.presentation.ui.eventDetail.EventDetailActivity import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import java.time.LocalDate @AndroidEntryPoint @@ -64,16 +60,6 @@ class ConferenceFragment : BaseFragment(R.layout.frag initView() setupEventsObserver() setupFiltersObserver() - - if (savedInstanceState != null) { - val index = savedInstanceState.getInt(STATE_POSITION_INDEX) - val offset = savedInstanceState.getInt(STATE_POSITION_OFFSET) - val layoutManager = binding.rvEvents.layoutManager as LinearLayoutManager - lifecycleScope.launch { - delay(DELAY_RECYCLER_VIEW_ITEM_READY) - layoutManager.scrollToPositionWithOffset(index, offset) - } - } } private fun initView() { @@ -168,20 +154,4 @@ class ConferenceFragment : BaseFragment(R.layout.frag ) filterActivityLauncher.launch(filterActivityIntent) } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - val layoutManager = binding.rvEvents.layoutManager as LinearLayoutManager - val index = layoutManager.findFirstVisibleItemPosition() - val topView = binding.rvEvents.getChildAt(0) - val offset = topView.top - outState.putInt(STATE_POSITION_INDEX, index) - outState.putInt(STATE_POSITION_OFFSET, offset) - } - - companion object { - private const val STATE_POSITION_INDEX = "STATE_POSITION_INDEX" - private const val STATE_POSITION_OFFSET = "STATE_POSITION_OFFSET" - private const val DELAY_RECYCLER_VIEW_ITEM_READY = 300L - } } From 92e243245c29012fc63badedc0b6a445382afa5a Mon Sep 17 00:00:00 2001 From: ki960213 Date: Wed, 7 Feb 2024 18:04:32 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat(CompetitionFragment):=20RecyclerViewPr?= =?UTF-8?q?eloader=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/competitionList/CompetitionFragment.kt | 10 +++++++--- .../ui/conferenceList/ConferenceFragment.kt | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/competitionList/CompetitionFragment.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/competitionList/CompetitionFragment.kt index 897e14017..2bc8f3d4b 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/competitionList/CompetitionFragment.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/competitionList/CompetitionFragment.kt @@ -14,9 +14,9 @@ import com.emmsale.presentation.common.extension.getSerializableExtraCompat import com.emmsale.presentation.common.views.FilterTag import com.emmsale.presentation.common.views.filterChipOf import com.emmsale.presentation.ui.competitionFilter.CompetitionFilterActivity -import com.emmsale.presentation.ui.competitionList.recyclerView.CompetitionRecyclerViewAdapter import com.emmsale.presentation.ui.competitionList.uiState.CompetitionSelectedFilteringDateOptionUiState import com.emmsale.presentation.ui.competitionList.uiState.CompetitionSelectedFilteringOptionUiState +import com.emmsale.presentation.ui.conferenceList.recyclerView.EventRecyclerViewAdapter import com.emmsale.presentation.ui.eventDetail.EventDetailActivity import dagger.hilt.android.AndroidEntryPoint import java.time.LocalDate @@ -26,8 +26,12 @@ class CompetitionFragment : BaseFragment(R.layout.fragment_competition) { private val viewModel: CompetitionViewModel by viewModels() - private val eventAdapter: CompetitionRecyclerViewAdapter by lazy { - CompetitionRecyclerViewAdapter(::navigateToEventDetail) + private val eventAdapter: EventRecyclerViewAdapter by lazy { + EventRecyclerViewAdapter( + fragment = this, + onClickConference = ::navigateToEventDetail, + onPreloaderReady = { binding.rvEvents.addOnScrollListener(it) }, + ) } private val filterActivityLauncher = registerForActivityResult(StartActivityForResult()) { result -> diff --git a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt index 2f99cfb3f..c8f4c3257 100644 --- a/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt +++ b/android/2023-emmsale/app/src/main/java/com/emmsale/presentation/ui/conferenceList/ConferenceFragment.kt @@ -25,7 +25,7 @@ import java.time.LocalDate class ConferenceFragment : BaseFragment(R.layout.fragment_conference) { private val viewModel: ConferenceViewModel by viewModels() - private val eventAdapter by lazy { + private val eventAdapter: EventRecyclerViewAdapter by lazy { EventRecyclerViewAdapter( fragment = this, onClickConference = ::navigateToEventDetail,