开发者社区 问答 正文

Firebase Android:Howe一次显示数据,零件

我需要一些帮助来获取Firebase数据库以显示实时数据库中的一些信息。

我正在使用Firebase Query通过使用Firebase Query在列表视图中显示最后30个项目limitToLast(30)。

但是,我想显示所有数据。我知道加载过多会导致系统变慢,这就是为什么30最佳的原因。

有没有办法设置它,以便当我向下滚动时,它不会显示在顶部的内容,或者在进入下一页时具有某种页面的位置,它显示了接下来的30条帖子。

我的代码:

String userID = user.getUid();
        databaseReference.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()){
                    Author author = data.getValue(Author.class);
                    authorList.add(author);
                }
                Layout_Saved_Quotes savedQuotes = new Layout_Saved_Quotes(Show_Saved_Quotes.this, authorList);
                list.setAdapter(savedQuotes);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Query databaseReference; databaseReference = FirebaseDatabase.getInstance().getReference().limitToLast(30);

展开
收起
几许相思几点泪 2019-12-17 18:11:39 740 分享 版权
阿里云 AI 助理回答

在Firebase Realtime Database中实现无限滚动或分页加载更多数据的功能,可以通过监听滚动事件并在用户滚动到底部时动态加载更多数据来实现。以下是一个简化的示例,说明如何结合使用limitToLast()startAt()方法来实现这一功能:

首先,你需要定义一些变量来跟踪当前加载的最后一个项目和加载状态:

private int loadCount = 30; // 初始加载数量
private Query databaseReference;
private ValueEventListener valueEventListener;
private String lastKey = null; // 用于存储最后一条加载的数据的键

然后,在你的初始化代码中设置初始查询:

databaseReference = FirebaseDatabase.getInstance().getReference()
    .child(userID)
    .orderByKey(); // 确保有排序依据,通常使用时间戳或自增ID作为键是好的做法

// 初始化加载前30条数据
loadMoreData(loadCount);

定义一个方法来加载更多数据,并更新lastKey

private void loadMoreData(int limit) {
    if (lastKey != null) {
        // 如果不是第一次加载,则使用上一次加载的最后一个项目的键作为查询的起始点
        databaseReference = databaseReference.startAt(lastKey).limitToLast(limit);
    } else {
        // 第一次加载时直接限制数量
        databaseReference = databaseReference.limitToLast(limit);
    }

    if (valueEventListener != null) {
        // 移除之前的监听器以避免重复加载
        databaseReference.removeEventListener(valueEventListener);
    }

    valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            List<Author> tempList = new ArrayList<>();
            for (DataSnapshot data : dataSnapshot.getChildren()) {
                Author author = data.getValue(Author.class);
                tempList.add(author);

                // 更新lastKey为这次加载的最后一个项目
                if (data.equals(dataSnapshot.getChildren().iterator().next())) { // 第一个元素是最新加载的
                    lastKey = data.getKey();
                }
            }

            // 反转列表,因为limitToLast会将最新的数据放在列表前面
            Collections.reverse(tempList);

            // 将新数据添加到现有列表中
            authorList.addAll(0, tempList); // 添加到开头,因为我们反向了列表
            Layout_Saved_Quotes savedQuotes = new Layout_Saved_Quotes(Show_Saved_Quotes.this, authorList);
            list.setAdapter(savedQuotes);

            // 检查是否已加载所有数据(例如,当返回的数据少于请求的数量时)
            if (tempList.size() < limit) {
                // 已经加载完所有数据,可以在这里做一些处理,比如显示“没有更多数据”
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            // 处理错误情况
        }
    };

    databaseReference.addValueEventListener(valueEventListener);
}

最后,你需要监听ListView或RecyclerView的滚动事件,以便在用户滚动到底部时调用loadMoreData()方法加载更多数据。这里假设你使用的是RecyclerView:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        if (!layoutManager.isSmoothScrolling()) {
            if (!layoutManager.findFirstVisibleItemPosition()) {
                // 用户滚动到了顶部,根据需要处理
            }
            if (!layoutManager.findLastCompletelyVisibleItemPosition()) {
                // 用户滚动到了底部,加载更多数据
                loadMoreData(loadCount);
            }
        }
    }
});

这个示例展示了基本的无限滚动实现逻辑。请根据你的具体需求调整代码,比如处理分页计数、错误处理以及UI反馈等。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答