firestore데이터 추가로 가져오기

quinones·2024년 3월 13일

오늘은 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
무한스크롤

profile
이우진

0개의 댓글