2017-01-08 23 views
0

更新:我已經決定REDIT更好的澄清與更集中的代碼的問題。檢索當前用戶的DataSnapshot火力地堡

我遇到的問題是我有一個UserList對象的ArrayList,它是從前一個活動中選擇的用戶,我們將這個selectedUsers稱爲。我有另一個對象,我想將selectedUsers以及Firebase中的當前用戶分組。這將被稱爲mGroupMembers,其中包含GroupMember對象。

我能夠將selectedUsers納入ArrayList mGroupMembers,但我無法將當前用戶(由其ID引用)插入到所述ArrayList中。我認爲問題在於Firebase。我不知道爲什麼當我撥打addListenerForSingleValueEvent時,當前用戶的數據不會添加到mGroupMembers ArrayList?

這裏是我的代碼:

public class TestActivity extends AppCompatActivity { 

    //Tag 
    private static String TAG = "TestActivity"; 

    private List<UserList> selectedUsers; 
    private TextView mPickedText; 
    private TextView mCurrentText; 
    private TextView mMembCountText; 
    private List<GroupMembers> mGroupMembers; 
    private String memberNames; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 

     //Selected users from previous activity. 
     selectedUsers = (List<UserList>) getIntent().getSerializableExtra("users"); 

     //Text Views 
     mPickedText = (TextView) findViewById(R.id.first_text); 
     mCurrentText = (TextView) findViewById(R.id.second_text); 
     mMembCountText = (TextView) findViewById(R.id.third_text); 

     //GroupMembs 
     mGroupMembers = new ArrayList<>(); 

     //Current user. 
     final String currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid(); 
     DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("users").child(currentUserID); 
     mRef.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       UserList user = dataSnapshot.getValue(UserList.class); 
       GroupMembers member; 

       //If the current user... 
       if (Objects.equals(user.getUid(), currentUserID)) { 
        mCurrentText.setText("Current: " + user.getName()); 
        member = new GroupMembers(user.getName(), user.getUsername(), user.getEmail(), user.getUid()); 

        Log.d(TAG, "Member object contains...Name: " + user.getName() + "\n" + 
          "Username: " + user.getUsername() + "\n" + 
          "Email: " + user.getEmail() + 
          "uid: " + user.getUid()); 

        selectedUsers.add(user); 

        mGroupMembers.add(member); 

        for (GroupMembers members : mGroupMembers) { 
         Log.d(TAG, "Member object contains...Name: " + members.getName() + "\n" + 
           "Username: " + members.getUsername() + "\n" + 
           "Email: " + members.getEmail() + 
           "uid: " + members.getUid()); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     //Picked user. 
     for (UserList selected : selectedUsers) { 
      GroupMembers member = new GroupMembers(); 

      member.setName(selected.getName()); 
      member.setUsername(selected.getUsername()); 
      member.setEmail(selected.getEmail()); 
      member.setUid(selected.getUid()); 

      mGroupMembers.add(member); 

      mPickedText.setText("Selected: " + selected.getName()); 
     } 

     for (GroupMembers members : mGroupMembers) { 
      memberNames = members.getName(); 
     } 



     mMembCountText.setText("Group Members: " + mGroupMembers.size() + " "); 
    } 
} 

這裏是火力地堡數據庫

{ 
    "users" : { 
    "S3l3yRh8TqRYNeTWQ7tKEdUe2K03" : { 
     "email" : "[email protected]", 
     "name" : "Antwon ", 
     "profilePicture" : " ", 
     "uid" : "S3l3yRh8TqRYNeTWQ7tKEdUe2K03", 
     "username" : "ant01" 
    }, 
    "af7KgxP7QgZT3d6adtgwBRwnsaI2" : { 
     "email" : "[email protected]", 
     "name" : "Bill", 
     "profilePicture" : " ", 
     "uid" : "af7KgxP7QgZT3d6adtgwBRwnsaI2", 
     "username" : "Bill123" 
    } 
    } 
} 

這裏是當我登錄了mGroupMembers ArrayList中會發生什麼:

D/TestActivity: Member object contains...Name: Antwon 
       Username: ant01 
       Email: [email protected]: S3l3yRh8TqRYNeTWQ7tKEdUe2K03 
D/TestActivity: Member object contains...Name: Bill 
       Username: Bill123 
       Email: [email protected]: af7KgxP7QgZT3d6adtgwBRwnsaI2 
D/TestActivity: Member object contains...Name: Antwon 
       Username: ant01 
       Email: [email protected]: S3l3yRh8TqRYNeTWQ7tKEdUe2K03 

當前用戶( Antwon)正在添加,但爲什麼當我運行該程序時不顯示?現在程序只顯示所選用戶的名字以及當前用戶的名字。然後它顯示mGroupMembers的大小。當然,它的大小隻有一個時,它應該是兩個。

+2

您已經包含鏈接到JSON樹在你的問題的照片。請用實際的JSON替換爲文本,您可以通過單擊[您的Firebase數據庫控制檯](https://console.firebase.google.com/project/_/database/data/)中的導出JSON鏈接輕鬆獲取該文本。 。將JSON作爲文本可以搜索,使我們能夠輕鬆使用它來測試您的實際數據,並將其用於我們的答案中,並且通常只是一件好事。 –

+0

謝謝你讓我知道這件事,我已經編輯了它@FrankvanPuffelen –

+0

你的問題描述與你發佈的代碼不一致。你說:_我決定嘗試調試'selectedUsers.add(mCurrentUsers)'_。該聲明不在發佈的代碼中。 –

回答

1

意外的行爲是火力地堡聽衆的異步性的結果。在從Firebase服務器檢索數據快照之前,onDataChange()不會執行。這通常需要幾毫秒,並且會在添加偵聽器之後的語句之後發生。在你的代碼的情況下,這對於語句執行之前onDataChange()已解僱並添加當前用戶:

//Picked user. 
    for (UserList selected : selectedUsers) { 
     GroupMembers member = new GroupMembers(); 

     member.setName(selected.getName()); 
     member.setUsername(selected.getUsername()); 
     member.setEmail(selected.getEmail()); 
     member.setUid(selected.getUid()); 

     mGroupMembers.add(member); 

     mPickedText.setText("Selected: " + selected.getName()); 
    } 

火力地堡的數據的異步加載的進一步解釋是this answer提供。

+0

所以我應該在for循環之前添加一個進度對話框?或者你認爲我應該怎麼做,以便及時檢索數據庫快照?編輯:剛剛看到你的鏈接,謝謝。 –