'Firestore Paging Adapter- How to know if query returns 0 results

I'm using firestore paging adapter to populate my RecyclerView with data from Firestore, if collection in Firestore is empty I would like to show a TextView to inform user about that, if it is not then I would like to populate EecyclerView with data but I don't see a way to do this with Firestore paging adapter because I can't acces data from inside the fragment where I create adapter Im my Fragment inside onViewCreated

val config = PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPrefetchDistance(2)
                .setPageSize(5)
                .build()
        val options = FirestorePagingOptions.Builder<Question>()
                .setLifecycleOwner(viewLifecycleOwner)
                .setQuery(FirestoreUtil.myFeedQuery, config, Question::class.java)
                .build()
        mAdapter = WallFeedRVAdapter(this, options)

WallFeedRVAdapter is RecyclerView adapter where I populate MyViewHolder with loaded data. How can I from this current fragment that hosts RecyclerView know if myFeedQuery returned any results so I can update recyclerView visibility to GONE and emptyInfoTextView to VISIBLE.



Solution 1:[1]

To get the number of items that are returned by the query which is passed to the FirestorePagingOptions object, you need to use getItemCount() method that exist in your adapter class. Because the data from Cloud Firestore is loaded asynchronously, you cannot simply call getItemCount() directly in your adapter class, as it will always be zero. So in order to get the total number of items, you need to register an observer like in the following lines of code:

mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
    public void onItemRangeInserted(int positionStart, int itemCount) {
        int totalNumberOfItems = adapter.getItemCount();
        Log.d(TAG, String.valueOf(totalNumberOfItems));
        if(totalNumberOfItems == 0) {
            recyclerView.setVisibility(View.GONE);
            emptyInfoTextView.setVisibility(View.VISIBLE);
        }
    }
});

Solution 2:[2]

I solved this problem by simple code. Just override onLoadingStateChangedListner method inside your FirestorePagingAdapter and then use getItemCount. I implemented it as follow -

@Override
protected void onLoadingStateChanged(@NonNull LoadingState state) {
    switch (state){
        case LOADED:
        case FINISHED:
            progressBar.setVisibility(View.GONE);
            if(getItemCount() == 0) {
                emptyIcon.setVisibility(View.VISIBLE);
                recyclerview.setVisibility(View.GONE);
            }
            break;
    }
    super.onLoadingStateChanged(state);
}

Solution 3:[3]

solved issue with registerAdapterDataObserver

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alex Mamo
Solution 2 Michael
Solution 3 Alpesh Desai