仅打印完成的memberList

问题描述 投票:-2回答:3

所以Code现在看起来像这样。

问题是我得到了多个Logprints。但我只需要完整和完成的meberList。

for (String memberByNumber : memberListByNumber) {
                    mFirebaseDatabaseReference.child("userUidsByNumber/").child(memberByNumber).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                String userUid = dataSnapshot.getValue().toString();
                                memberList.add(userUid);

                                Log.d("LOL", "ContactsAdapter: " + memberList);
                            } else {
                                Snackbar.make(view, R.string.user_does_not_exist, Snackbar.LENGTH_LONG).show();
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Snackbar.make(view, R.string.error, Snackbar.LENGTH_LONG).show();
                        }
                    });
                }

我希望你理解我的问题,并能帮助我。提前致谢。

java android loops for-loop arraylist
3个回答
0
投票

如果为onDataChange的每个成员调用memberListByNumber,那么你可以试试

final int total = memberListByNumber.size();
for (String memberByNumber : memberListByNumber) {
    mFirebaseDatabaseReference
            .child("userUidsByNumber/")
            .child(memberByNumber)
            .addValueEventListener(new ValueEventListener() {
        int n = total;
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                String userUid = dataSnapshot.getValue().toString();
                memberList.add(userUid);
                if (--n <= 0) Log.d("LOL", "ContactsAdapter: " + memberList);
            } else {
                Snackbar.make(view, R.string.user_does_not_exist, Snackbar.LENGTH_LONG).show();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Snackbar.make(view, R.string.error, Snackbar.LENGTH_LONG).show();
        }
    });
}

0
投票

我想评论它,但由于我在这里的声誉,我不能这样,这是我的答案你记录每个条目到一个文件,这样它只是使打印必要的条目更加困难所以走在不同的路径,再给一个如果 - 现有的一个else语句,并使用try-exception将已完成和已取消的内容分成一些缓存,然后使完成的文件无效


0
投票

在firebase中,从来没有一个完整的列表。

只要任何数据在任何子节点下发生更改,值事件就会不断发生。此外,值事件最后发生,即在所有子事件完成之后,确保该点处的所有子节点都存在。下一个事件将为您提供该特定点的完整列表。

在每次数据更改调用时,您可以清除列表,添加所有新值并打印出来。这就是firebase的工作原理。

如果只需要整个列表一次且不需要任何新更改,则可以使用addListenerForSingleValueEvent方法添加值事件侦听器。现在列表将被读取一次而不再读取。但是,如果启用了持久性,则数据将从手机缓存中读取一次,而不是从数据库中读取

也许您正在寻找的是一个ChildEventListener,它将为您提供更精细的控制。这将有子项添加,删除和更改事件,这将为您提供一次一个孩子的列表数据。

我不知道你的实际目的是什么,所以这是我能解释的最好的。希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.