Room에서 LiveData사용과 paging처리
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를 사용하여 검색결과에 따라 다른 데이터를 보여주는 것이 가능하다.
출처: https://akaisun.tistory.com/67?category=622886 [아카이의 개발창고]
'안드로이드 > 개발 TIP' 카테고리의 다른 글
retrofit2를 사용하여 Authorization 인증하기 (0) | 2020.12.09 |
---|---|
progress wrapper (0) | 2020.12.09 |
바코드, QR CODE 생성 및 스캐너 (0) | 2020.12.09 |
webview scroll detecting (0) | 2020.12.09 |
SharedPreferences 똑똑하게 사용하기. (0) | 2020.12.09 |
x86 emulation currently requires hardware acceleration (0) | 2020.12.09 |
library version check (0) | 2020.12.09 |
log 관리하기 (0) | 2020.12.09 |