본문 바로가기
안드로이드

Room에서 LiveData사용과 paging처리

by 아카이sun 2019. 9. 5.

Room을 이용하여 내부에 대량의 데이터를 저장할 경우. 저장된 데이터를 페이징처리를 통하여 효율적인 리스트를 표현하는 것이 좋다.

 

Dao

@Query("SELECT * FROM table")
abstract fun selectList() : DataSource.Factory<Int, Post>

페이징처리 부분


val config = PagedList.Config.Builder()
            .setInitialLoadSizeHint(20) //최초 로드사이즈는 20개
            .setPageSize(10) // 페이징당 10개
            .setPrefetchDistance(10) // 10개마다 다음페이지를 미리불러오기
            .setEnablePlaceholders(true)
            .build()
            
var pagedItems = LivePagedListBuilder(dao.selectList(), config).build()

 

LiveData의 observer설정

override fun onResume() {
    super.onResume()
    val hasListObserver = pagedItems?.hasObservers() ?: false
    if(!hasListObserver){
    	pagedItems?.observeForever(itemObserver)
    }
}

override fun onPause() {
    super.onPause()
    val hasListObserver = pagedItems?.hasObservers() ?: false
    if(hasListObserver){
    	pagedItems?.removeObserver(itemObserver)
    }
}

private val itemObserver = Observer<PagedList<Post>>{ list ->
	adapter.submitList(list)
}

 

간단하쥬?

 

여기서 잠깐!! 그렇다면 LiveData를 이용하여 쿼리처리를 하고 싶다면?

val config = PagedList.Config.Builder()
            .setInitialLoadSizeHint(20)
            .setPageSize(10)
            .setPrefetchDistance(10)
            .setEnablePlaceholders(true)
            .build()
            
 val filterText = MutableLiveData<String>()          
 val pagedList = Transformations.switchMap(query, Function {
 	when (it.isNullOrEmpty()) {
 		true -> LivePagedListBuilder(dao.selectList(), config).build()
 		false -> LivePagedListBuilder(dao.search(it), config).build()
 	}
 })
 
 editText.addTextChangedListener(object: TextWatcher {
 	override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
 		filterText.value = query?.toString() ?: ""
	}

	override fun afterTextChanged(s: Editable?) { }

	override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { }
})

Transformations.siwtchMap을 사용하게되면 filter를 사용하여 검색결과에 따라 다른 데이터를 보여주는 것이 가능하다.

댓글