오늘은 firestore에서 데이터를 계속해서 원하는만큼 가져오는법을 공부했다.
먼저 첫번째로 원하는 데이터를 5개 가져오는 방법이다.
var lastVisible: DocumentSnapshot? = null
...
fun callData() {
val db = Firebase.firestore
var baseQuery: Query = db.collection("camps")
baseQuery.limit(5)
.get()
.addOnSuccessListener { documents ->
val newCampList = mutableListOf<CampEntity>()
for (document in documents) {
val camp = document.toObject(CampEntity::class.java)
newCampList.add(camp)
}
_myList.value = newCampList
lastVisible = documents.documents[documents.size() - 1]
}
.addOnFailureListener { exception ->
// 오류 처리
}
}
firestore에는 "camps"라는 이름의 collection이 있고, 이 안에는 많은 document들이 있다.
viewModel에서 .limit()를 이용해서 5개의 데이터만 가져와준 후 각각의 문서들을 미리 만들어둔 CampEntitiy데이터 클래스 형식으로 객체화 시켜준다. 그후 새로만든 newCampList에 추가를 해주고 해당 리스트를 옵저빙해주는 방식으로 가져와주고있다.
여기서 중요한건 lastVisible이다. 가져온 데이터중 가장 마지막 데이터를 저장해준다.
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val visibleItemCount = layoutManager.childCount
val totalItemCount = layoutManager.itemCount
val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition()
if (visibleItemCount + firstVisibleItemPosition >= totalItemCount && firstVisibleItemPosition >= 0) {
// 목록의 끝에 도달했을 때, 더 많은 데이터 로드
if(!viewModel.isLoadingData){
viewModel.loadMoreData()
}
}
}
})
다음으로 viewModel이 아닌 Fragment에서 addOnScrollListener를 이용해서 사용자의 리사이클러뷰 스크롤을 감지한다. 마지막에 도달할때 loadMoreData를 불러와준다.
다음으로 같은 방식으로 불러오는데 startAfter를 사용해준다. startAfter는 해당데이터 다음 데이터부터 가져와준다.
var isLoadingData: Boolean = false
...
fun loadMoreData() {
if(isLoadingData){
return
}
isLoadingData = true
val db = Firebase.firestore
if (lastVisible != null) {
val next = db.collection("camps")
.startAfter(lastVisible!!)
.limit(5)
next.get()
.addOnSuccessListener { nextDocuments ->
val newCampList = mutableListOf<CampEntity>()
for (document in nextDocuments) {
val camp = document.toObject(CampEntity::class.java)
newCampList.add(camp)
}
val currentList = _myList.value ?: mutableListOf()
currentList.addAll(newCampList)
_myList.value = currentList
if (nextDocuments.size() > 0) {
lastVisible = nextDocuments.documents[nextDocuments.size() - 1]
Log.d("Search", "무한 ${lastVisible?.get("facltNm")}")
} else {
lastVisible = null // 더 이상 데이터가 없을 때 lastVisible을 null로 설정
}
isLoadingData = false
}
.addOnFailureListener { exception ->
// 오류 처리
isLoadingData = false
}
}
}
이렇게 사용해서 스크롤시 계속해서 새로운데이터를 5개씩 불러와주고 있다.
firestore
firebase
무한스크롤