Android 正在检索当前用户';射击射击基地
更新:我决定重述这个问题,以便更好地澄清问题,并使用更集中的代码 我遇到的问题是,我有一个UserList对象的ArrayList,这些对象是以前活动中选定的用户,我们将其称为Android 正在检索当前用户';射击射击基地,android,firebase,android-recyclerview,firebase-realtime-database,Android,Firebase,Android Recyclerview,Firebase Realtime Database,更新:我决定重述这个问题,以便更好地澄清问题,并使用更集中的代码 我遇到的问题是,我有一个UserList对象的ArrayList,这些对象是以前活动中选定的用户,我们将其称为selectedUsers。我还有另一个对象,我想将selectedUsers以及Firebase中的当前用户分组到其中。这将被称为mGroupMembers,它保存GroupMember对象 我能够将selectedUsers放入mGroupMembers的ArrayList,但无法将当前用户(由其ID引用)放入所述Ar
selectedUsers
。我还有另一个对象,我想将selectedUsers
以及Firebase中的当前用户分组到其中。这将被称为mGroupMembers
,它保存GroupMember对象
我能够将selectedUsers
放入mGroupMembers
的ArrayList,但无法将当前用户(由其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() + " ");
}
}
下面是我记录mGroupMembers
ArrayList时发生的情况:
D/TestActivity: Member object contains...Name: Antwon
Username: ant01
Email: antwon@domain.comuid: S3l3yRh8TqRYNeTWQ7tKEdUe2K03
D/TestActivity: Member object contains...Name: Bill
Username: Bill123
Email: bill@domain.comuid: af7KgxP7QgZT3d6adtgwBRwnsaI2
D/TestActivity: Member object contains...Name: Antwon
Username: ant01
Email: antwon@domain.comuid: S3l3yRh8TqRYNeTWQ7tKEdUe2K03
正在添加当前用户(Antwon),但为什么在我运行程序时它不显示?现在,程序只显示所选用户的名称以及当前用户的名称。然后显示
mGroupMembers
的大小。当然,大小只有1,而它应该是2。意外的行为是Firebase侦听器异步特性的结果<代码>onDataChange()在从Firebase服务器检索数据快照之前不会执行。这通常需要几毫秒,并且将在添加侦听器后的语句之后发生。在您的代码中,在onDataChange()启动并添加当前用户之前执行此for语句:
//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());
}
有关Firebase异步加载数据的进一步解释,请参见。您的问题中包含了指向JSON树图片的链接。请将其替换为实际的JSON文本,您可以通过单击中的导出JSON链接轻松获取。将JSON作为文本使其具有可搜索性,允许我们轻松使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。感谢您让我知道这一点,我现在已经编辑了@frankvanpuffeleny您的问题描述与您发布的代码不一致。你说:我决定尝试调试
selectedUsers.add(mCurrentUsers)
。该语句不在发布的代码中。请在添加侦听器之前尝试在onCreate方法上初始化newRef和currentUserId。我尝试了此操作,但运气不佳@RosárioPereiraFernandesSo我是否应该在for循环之前添加进度对话框?或者,您认为我应该如何进行,以便及时检索数据库快照?编辑:刚刚看到你的链接,谢谢。
//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());
}