SMALL
현재 구현에는 특정 조건이 충족되면 더 많은 데이터를 로드하도록 ViewModel에서 호출하는 binding.setupScrollListener()라는 메소드가 있다. Paging 라이브러리는 이 모든 작업을 자동으로 실행하므로 이 메소드와 그 사용법을 삭제할 수 있다.
이제 AriricleAdapter가 더 이상 ListAdapter가 아니라 PagingDataAdatper이므로 간단하게 두 가지를 변경한다.
- Flow의 터미널 연산자를 ViewModel에서 collect 대신 collectLatest로 전환한다.
- ArticleAdapter에 submitList()가 아닌 submitData() 변경사항을 알린다.
새 PagingData 인스턴스를 내보낼 때 이전 pagingData 내보내기에 관한 컬렉션이 취소되도록 pagingData Flow에서 collectLatest를 사용한다.
이 변경사항에 따라 Activity는 다음과 같이 표시된다.
import kotlinx.coroutines.flow.collectLatest
class ArticleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityArticlesBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
val viewModel by viewModels<ArticleViewModel>(
factoryProducer = { Injection.provideViewModelFactory(owner = this) }
)
val items = viewModel.items
val articleAdapter = ArticleAdapter()
binding.bindAdapter(articleAdapter = articleAdapter)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
items.collectLatest {
articleAdapter.submitData(it)
}
}
}
}
}
private fun ActivityArticlesBinding.bindAdapter(
articleAdapter: ArticleAdapter
) {
list.adapter = articleAdapter
list.layoutManager = LinearLayoutManager(list.context)
val decoration = DividerItemDecoration(list.context, DividerItemDecoration.VERTICAL)
list.addItemDecoration(decoration)
}
LIST
'Kotlin' 카테고리의 다른 글
[Paging 고급] 데이터 소스 정의 (0) | 2023.02.20 |
---|---|
[Paging] UI에 로드 상태 표시 (0) | 2023.02.20 |
[Paging] PagingData를 사용하도록 어댑터 설정 (0) | 2023.02.20 |
[Paging] ViewModel에서 PagingData 요청 및 캐시 (0) | 2023.02.20 |
[Paging] UI용 PagingData 생성 (0) | 2023.02.07 |
댓글