从另一个ArrayList复制的ArrayList <Object>为空,即使有数据

时间:2019-07-10 21:33:50

标签: java android asynchronous arraylist firebase-realtime-database

我通过Model类将项目添加到列表中,然后将这些项目添加到ArrayList<Object>中。但是,即使commentsList.size() > 1的大小也总是为零。

我尝试将List转换为ArrayList并尝试添加项目。但是在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;
}

1 个答案:

答案 0 :(得分:0)

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

我建议编写另一个函数,该函数在从您的Firebase数据库接收数据后调用onDataChange函数时将被调用。例如,在与以下相同的类中编写函数。

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

希望有帮助!