无论登录哪个用户,arrayList总是装载来自Firebase数据库的用户信息? [英] arrayList always loaded with user info from Firebase database regardless of which user is signed in ؟

查看:136
本文介绍了无论登录哪个用户,arrayList总是装载来自Firebase数据库的用户信息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在showdata方法中,当我运行应用程序并用任何用户登录时,加载FirebaseUser信息的方法中的arrayList总是加载User_03信息,

调试show即:


  • DataSnapshot ds加载了正确的登录用户值(右键和信息)。
  • uInfo(携带用户信息登录的对象)从数据库中加载正确的数据。 = $ undefined。

  • 我认为arryList大小有问题。



我到达断点的时候把它拿到:toastMassege(完成了)。

  public class AddToDatabase extends AppCompatActivity {
private static final String TAG =AddToDatabase;
私人ListView userInfolist;
private FirebaseAuth mAuth;
私有FirebaseAuth.AuthStateListener mAuthListener;
字符串userId;
UserInformations uInfo = new UserInformations();
@Override
protected void onCreate(Bundled savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_to_database);

userInfolist =(ListView)findViewById(R.id.userInfolist);
mAuth = FirebaseAuth.getInstance();
FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference myRef = mFirebaseDatabase.getReference();
FirebaseUser user = mAuth.getCurrentUser();
userId = user.getUid();
$ b mAuthListener = new FirebaseAuth.AuthStateListener(){
@Override $ b $ public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth){
FirebaseUser user = firebaseAuth.getCurrentUser();
if(user!= null){
Log.d(TAG,onAuthStateChanged:signed_in:+ user.getUid());
toastMassege(您已成功登录+
user.getEmail());
} else {
Log.d(TAG,onAuthStateChanged:signed_out);
toastMassege(您已成功登出);
}
}
};

myRef.addValueEventListener(new ValueEventListener(){
@Override $ b $ public void onDataChange(DataSnapshot dataSnapshot){
showData(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError error){
}
}); (DataSnapshot ds:dataSnapshot.getChildren()){

private void showData(DataSnapshot dataSnapshot){
)uInfo.setName(ds.getValue(UserInformations的.class).getName());
uInfo.setEmail(ds.getValue(UserInformations.class).getEmail());
uInfo.setPhone_num(ds.getValue(UserInformations.class).getPhone_num());

ArrayList< String> arrayList = new ArrayList<>();
int listSize = arrayList.size();
arrayList.add(uInfo.getName());
arrayList.add(uInfo.getEmail());
arrayList.add(uInfo.getPhone_num());
ArrayAdapter< String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList);
userInfolist.setAdapter(adapter);
toastMassege(完成);

$ b @Override
public void onStart(){
super.onStart();
mAuth.addAuthStateListener(mAuthListener);

@Override
public void onStop(){
super.onStop();
if(mAuthListener!= null){
mAuth.removeAuthStateListener(mAuthListener);

$ b private void toastMassege(String massege){
Toast.makeText(this,massege,Toast.LENGTH_SHORT).show();





这是类UserInformations

  class UserInformations {

public String email,name,phone_num;
UserInformations(){
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email = email;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getPhone_num(){
return phone_num;
}
public void setPhone_num(String phone_num){
this.phone_num = phone_num;


$ / code $ / pre
$ b

解决方案

这是因为您已经声明了 ArrayList< String> arrayList = new ArrayList<>(); 在for循环中。这意味着你每次迭代都要创建一个ArrayList类的新实例。

为了解决这个问题, p>

  private void showData(DataSnapshot dataSnapshot){
ArrayList< String> arrayList = new ArrayList<>(); //移动到
$ b之外(DataSnapshot ds:dataSnapshot.getChildren()){

uInfo.setName(ds.getValue(UserInformations.class).getName());
uInfo.setEmail(ds.getValue(UserInformations.class).getEmail());
uInfo.setPhone_num(ds.getValue(UserInformations.class).getPhone_num());

int listSize = arrayList.size();
arrayList.add(uInfo.getName());
arrayList.add(uInfo.getEmail());
arrayList.add(uInfo.getPhone_num());
ArrayAdapter< String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList);
userInfolist.setAdapter(adapter);
toastMassege(完成);
}
}


In showdata method witch load FirebaseUser info when I run the app and signed in with any user , arrayList in the method is always loaded with User_03 info ,

debugging show that :

  • DataSnapshot ds is loaded with right value of signed in user ( right key and info ) .
  • uInfo ( the object which carry signed in user info) loaded with right data from database .
  • uInfo.setName(ds.getValue(UserInformations.class).getName()); = undefined .
  • I think there is something wrong in arryList size .

the attached screen shot I take it when arrive to breakpoint in line : toastMassege("it's Done") .

public class AddToDatabase extends AppCompatActivity {
private static final String TAG = "AddToDatabase";
private ListView userInfolist ;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
String userId;
UserInformations uInfo =new UserInformations();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_to_database);

    userInfolist = (ListView) findViewById(R.id.userInfolist);
    mAuth = FirebaseAuth.getInstance();
    FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference myRef = mFirebaseDatabase.getReference();
    FirebaseUser user = mAuth.getCurrentUser();
    userId = user.getUid();

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                toastMassege(" You are successfly signed in with " + 
                user.getEmail());
            } else {
                Log.d(TAG, "onAuthStateChanged:signed_out");
                toastMassege(" You are successfly signed out ");
            }
        }
    };

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          showData(dataSnapshot);
        }
        @Override
        public void onCancelled(DatabaseError error) {
        }
    });
}
private void showData(DataSnapshot dataSnapshot) {
  for(DataSnapshot ds : dataSnapshot.getChildren()){

      uInfo.setName(ds.getValue(UserInformations.class).getName());
      uInfo.setEmail(ds.getValue(UserInformations.class).getEmail()); 
     uInfo.setPhone_num(ds.getValue(UserInformations.class).getPhone_num());

      ArrayList<String> arrayList=new ArrayList<>();
      int listSize = arrayList.size();
      arrayList.add(uInfo.getName());
      arrayList.add(uInfo.getEmail());
      arrayList.add(uInfo.getPhone_num()); 
      ArrayAdapter<String> adapter =new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList);
      userInfolist.setAdapter(adapter);
      toastMassege("its Done ");
  }
}
@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}
private void toastMassege(String massege) {
    Toast.makeText(this, massege, Toast.LENGTH_SHORT).show();
}

 }

this is class UserInformations

class UserInformations {

public String email,name,phone_num ;
UserInformations() {
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getPhone_num() {
    return phone_num;
}
public void setPhone_num(String phone_num) {
    this.phone_num = phone_num;
}
}

解决方案

This is happening because you are have declared the ArrayList<String> arrayList=new ArrayList<>(); inside the for loop. This means that you are creating a new instance of ArrayList class every time you iterate.

In order to solve this, just move the decration outside for loop like this:

private void showData(DataSnapshot dataSnapshot) {
  ArrayList<String> arrayList=new ArrayList<>(); //Moved outside

  for(DataSnapshot ds : dataSnapshot.getChildren()){

      uInfo.setName(ds.getValue(UserInformations.class).getName());
      uInfo.setEmail(ds.getValue(UserInformations.class).getEmail()); 
      uInfo.setPhone_num(ds.getValue(UserInformations.class).getPhone_num());

      int listSize = arrayList.size();
      arrayList.add(uInfo.getName());
      arrayList.add(uInfo.getEmail());
      arrayList.add(uInfo.getPhone_num()); 
      ArrayAdapter<String> adapter =new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayList);
      userInfolist.setAdapter(adapter);
      toastMassege("its Done ");
  }
}

这篇关于无论登录哪个用户,arrayList总是装载来自Firebase数据库的用户信息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆