【问题标题】:Firestore Paging Adapter- How to know if query returns 0 resultsFirestore 分页适配器 - 如何知道查询是否返回 0 个结果
【发布时间】:2019-12-17 20:59:39
【问题描述】:

我正在使用 Firestore 分页适配器使用 Firestore 中的数据填充我的 RecyclerView,如果 Firestore 中的集合为空,我想显示一个 TextView 以通知用户,如果不是,那么我想用数据填充EecyclerView,但我看不到使用 Firestore 分页适配器执行此操作的方法,因为我无法从创建适配器的片段内部访问数据 我在onViewCreated里面是我的Fragment

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 是 RecyclerView 适配器,我用加载的数据填充 MyViewHolder。我如何从托管 RecyclerView 的当前片段中知道 myFeedQuery 是否返回任何结果,以便我可以将 recyclerView 可见性更新为 GONE 并将 emptyInfoTextView 的可见性更新为 VISIBLE。

【问题讨论】:

    标签: java android firebase pagination google-cloud-firestore


    【解决方案1】:

    要获取传递给FirestorePagingOptions 对象的查询返回的项目数,您需要使用适配器类中存在的getItemCount() 方法。由于来自 Cloud Firestore 的数据是异步加载的,因此您不能简单地在适配器类中直接调用 getItemCount(),因为它始终是。所以为了得到项目的总数,你需要像下面的代码行一样注册一个观察者:

    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);
            }
        }
    });
    

    【讨论】:

    • 在我的情况下,当 items == 0 时它不起作用,但当项目数大于零时它工作正常,你能帮忙吗?
    • @Xylan 没有看到你的代码,恐怕我帮不上什么忙。因此,请使用自己的 MCVE 发布另一个新问题,以便我和其他 Firebase 开发人员可以帮助您。
    • onItemRangeInserted 方法似乎只有在适配器插入项时才会调用,但在没有项要添加的情况下,甚至不会调用该方法
    【解决方案2】:

    我通过简单的代码解决了这个问题。只需覆盖FirestorePagingAdapter 中的onLoadingStateChangedListner 方法,然后使用getItemCount。 我实现它如下 -

    @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);
    }
    

    【讨论】:

    • 检查 getItemCount() == 0 时很有帮助。
    猜你喜欢
    • 2021-09-11
    • 2015-11-01
    • 2020-03-09
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多