java - 从另一个ArrayList复制过来的ArrayList<Object>即使有数据也是空的

标签 java android asynchronous arraylist firebase-realtime-database

<分区>

我通过模型类将项目添加到列表,然后将这些项目添加到 ArrayList<Object> .但是,即使 commentsList.size() > 1 我总是得到零大小.

我尝试转换 ListArrayList并尝试添加项目。但是 ArrayList<Object> 上的大小始终为 0 .

ArrayList<Comments> commentsList = new ArrayList<>(Arrays.asList(new Comments("username", "time", "date")));

这是我正在使用的函数。

private ArrayList<Object> getObject() {

    if (getComments() != null && getComments().size()>=1) {
        objects.add(getComments().get(0));
    }

    return objects;
}

public static ArrayList<Comments> getComments() {
    ArrayList<Comments> commentsList = new ArrayList<>();

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Comments");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            commentsList.clear();

            for (DataSnapshot shot : snapshot1.getChildren()) {
                 Comments comments = shot.getValue(Comments.class);
                 commentsList.add(comments);                          
           }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

    return commentsList;
}

最佳答案

getComments函数,您正在执行一个异步操作,该操作正在从您的 firebase 数据库中检索数据。因此,您的 commentsList 中实际上没有任何内容。 .该函数只是初始化一个新的 ArrayList当然,使用零元素,并创建一个 ValueEventListener它正在等待您的应用程序接收数据。但是,此操作是异步的(在单独的线程中运行),因此在创建 ValueEventListener 之后,该函数立即返回空列表。因此,当您尝试构建 ArrayList<Object> 时,您也会得到一个空列表。在你的getObject功能。

我建议编写另一个函数,在 onDataChange 时调用该函数从您的 firebase 数据库接收数据后调用该函数。例如,在同一个类中编写一个函数,如下所示。

void nowCreateArrayListOfObjects() {
    // TODO: Call the getObject function here
}

现在从你的 onDataChange 调用这个函数功能如下。

public static ArrayList<Comments> getComments() {
    ArrayList<Comments> commentsList = new ArrayList<>();

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Comments");

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            commentsList.clear();

            for (DataSnapshot shot : snapshot1.getChildren()) {
                Comments comments = shot.getValue(Comments.class);
                commentsList.add(comments);
            }

            // Invoke the function here to get the values now
            nowCreateArrayListOfObjects();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

    return commentsList;
}

希望对您有所帮助!

关于java - 从另一个ArrayList复制过来的ArrayList<Object>即使有数据也是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978955/

相关文章:

java - 将 JScrollPane 的组件向左对齐?

ios - 异步请求运行缓慢 - iOS

angular - 如何正确使用 Observable 和 Angular 异步管道?

javascript - 接收错误 JSON 中位置 0 处出现意外标记 <;这是后端还是前端问题?

java - 是否有任何 "threshold"证明多线程计算是合理的?

java - 无法通过测试用例从 src/main/resources 访问文件

java - Mysql 的 Oracle 序列类似物

java - 屏幕关闭时计时器停止工作

java - 在 Android Activity 中使用 Kotlin 模型类的 getter 和 setter

android - 为在 Libgdx android 中支持多个屏幕提供资源