본문 바로가기
Kotlin

[Paging] UI에서 PagingData 사용

by 명훈스토리 2023. 2. 20.
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

댓글