Соберите все данные из FirebaseDatabse и вызовите notifyDataSetChanged () один раз - PullRequest
0 голосов
/ 13 ноября 2018

вкратце: у меня есть список идентификаторов пользователей, и я хочу перебрать базу данных, найти профили этих пользователей и поместить их в список.Но у меня проблема в следующем:

final List<Friend> friendsProfiles = new ArrayList<>();
    for (final FriendId friendId : friendIds) {
        mUserRef.child(friendId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                // Get the friend profile
                Friend friend = dataSnapshot.getValue(Friend.class);
                // Add to the list
                friendsProfiles.add(friend);
                // The problem is here, because its called as many times as the size of
                // the friendIds list. loadnewData() contains notifyDataSetChanged()
                mFriendsFragment.loadNewData(friendsProfiles);
            }

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

            }
        });
    }
    // It gives 0, because it's called before onDatachange()
    // So I can't call loadNewData() here
    Log.d(TAG, updatedFriendsRequestList.size());

Как это сделать правильно, правильно?

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете просто посчитать, сколько вы уже загрузили, а затем вызвать notifyDataSetChanged() только после того, как вы загрузили последний:

final List<Friend> friendsProfiles = new ArrayList<>();
for (final FriendId friendId : friendIds) {
    mUserRef.child(friendId).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            // Get the friend profile
            Friend friend = dataSnapshot.getValue(Friend.class);
            // Add to the list
            friendsProfiles.add(friend);

            if (friendsProfiles.size() == friendIds.length) {
                mFriendsFragment.loadNewData(friendsProfiles);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors, as they break the logic of your app
        }
    });
}
...