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를 사용하여 검색결과에 따라 다른 데이터를 보여주는 것이 가능하다.
'안드로이드' 카테고리의 다른 글
바코드, QR CODE 생성 및 스캐너 (519) | 2019.09.12 |
---|---|
webview scroll detecting (2) | 2019.09.06 |
SharedPreferences 똑똑하게 사용하기. (2) | 2019.08.29 |
x86 emulation currently requires hardware acceleration (2) | 2019.02.22 |
library version check (4) | 2016.10.30 |
댓글