如何从另一个类访问arraylist?

时间:2020-08-13 12:46:06

标签: java android firebase arraylist

在类Register Activity中,我创建了ArrayList,日志显示它正在被填充。但是当我在AllUsers类中访问它时,它是空的。

public class AllUsers extends AppCompatActivity {

    private FirebaseUser user;
    private ArrayAdapter adapter;
    private FirebaseAuth mAuth;
    private ListView userListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_users);
        userListView = findViewById(R.id.usersListView);
        RegisterActivity registerActivity = new RegisterActivity();
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, registerActivity.getUserNames());
        userListView.setAdapter(adapter);
        for(String n : muserNames)
            Log.d("TagAllUsers", n);
        adapter.notifyDataSetChanged();
    }
}

这是注册活动。在signup()活动中,我向firebase注册了用户,同时我向ArrayList添加了名称,这很好。但是当我通过getUsernames()在All users类中访问此ArrayList时,它为空。

public class RegisterActivity extends AppCompatActivity {

    private EditText name, email, password, matchPassword, phone;
    private TextView textLogin;
    private FirebaseAuth mAuth;
    private ProgressBar progressBar;
    private Button btnSaveImage;
    private String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
    private static ArrayList<String> userNames;
    private static String userName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_register);
            progressBar = findViewById(R.id.progressBar);
            btnSaveImage = findViewById(R.id.btnSaveImage);
            name = (EditText) findViewById(R.id.editTextPersonName);
            email = (EditText) findViewById(R.id.editTextPersonEmail);
            phone = (EditText) findViewById(R.id.editTextPersonPhone);
            matchPassword = (EditText) findViewById(R.id.editTextMatchPassword);
            password = (EditText) findViewById(R.id.editTextPersonPassword);
            Button register = (Button) findViewById(R.id.buttonRegister);
            textLogin = findViewById(R.id.textlogin);
            userNames = new ArrayList();
            mAuth = FirebaseAuth.getInstance();

            register.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    signUp();
                }
            });
            textLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startActivity(new Intent(getApplicationContext(), MainActivity.class));
                }
            });
        }
        catch (Exception e){
            Toast.makeText(getApplicationContext(), "Error - "+e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    public ArrayList<String> getUserNames() {
        return userNames;
    }

    private void signUp() {
        try {
            String Email = email.getText().toString().trim();
            String Password = password.getText().toString().trim();

            if (Email.isEmpty()) {
                email.setError("Email required");
                email.requestFocus();
                return;
            }

        if(!Email.matches(emailPattern)){
            email.setError("Valid Email required");
            email.requestFocus();
            return;
        }

            if (Password.isEmpty()) {
                password.setError("Valid password required");
                password.requestFocus();
                return;
            }

            if (Password.length() < 6) {
                password.setError("Password should be at least 6 characters long");
                password.requestFocus();
                return;
            }
            progressBar.setVisibility(View.VISIBLE);
            mAuth.createUserWithEmailAndPassword(Email, Password)
                    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            progressBar.setVisibility(View.GONE);
                            if (task.isSuccessful()) {
                                // Sign in success, update UI with the signed-in user's information
                                Log.d("TAG", "createUserWithEmail:success");
                                Toast.makeText(getApplicationContext(), "Registration successful",
                                        Toast.LENGTH_SHORT).show();
                                FirebaseUser user = mAuth.getCurrentUser();
                                Users users = new Users(name.getText().toString(), email.getText().toString(), phone.getText().toString(), password.getText().toString());
                                FirebaseDatabase.getInstance().getReference("User_data").child(task.getResult().getUser().getUid()).setValue(users).addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        if(task.isSuccessful()){
                                            Toast.makeText(getApplicationContext(), "Data saved", Toast.LENGTH_SHORT).show();
                                        }
                                        else{
                                            Toast.makeText(getApplicationContext(), "Something went wrong!!", Toast.LENGTH_SHORT).show();
                                        }
                                    }
                                }).addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        FirebaseDatabase.getInstance().getReference("User_data").addChildEventListener(new ChildEventListener() {
                                            @Override
                                            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                                                userName = snapshot.child("name").getValue().toString();
                                                Log.d("TaguserName", userName);
                                                userNames.add(userName);
                                                for(String user_Name : userNames)
                                                Log.d("TagArrayList", user_Name);
                                            }

                                            @Override
                                            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

                                            }

                                            @Override
                                            public void onChildRemoved(@NonNull DataSnapshot snapshot) {

                                            }

                                            @Override
                                            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

                                            }

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

                                            }
                                        });
                                    }
                                });
                                Intent intent = new Intent(getApplicationContext(), AllUsers.class);
                                                           //This is to clear the login/signup actity so that whwn we press back, login activity dont come
                                intent.putExtra("From", "Register");
                                startActivity(intent);
                                finish();
                            } else {
                                if(task.getException() instanceof FirebaseAuthUserCollisionException){
                                    Toast.makeText(getApplicationContext(), "User already exists Login to continue",
                                            Toast.LENGTH_SHORT).show();
                                }
                                else {
                                    // If sign in fails, display a message to the user.
                                    Log.w("TAG", "createUserWithEmail:failure", task.getException());
                                    Toast.makeText(getApplicationContext(), "Authentication failed.",
                                            Toast.LENGTH_SHORT).show();
                                }
                            }
                        }
                    });

        }
        catch (Exception e){
            Toast.makeText(getApplicationContext(), "Error - "+e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

4 个答案:

答案 0 :(得分:3)

私有静态ArrayList userNames; 的声明是静态的。这意味着您可以使用

直接访问arraylist
RegisterActivity.userNames

不使用访问器方法(获取..)。您无需实例化RegisterActivity即可访问arraylist。因此

adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, RegisterActivity.userNames);

如果要保持使用 getUserNames(),则也将其声明为静态并通过类名调用。

答案 1 :(得分:1)

您不能仅通过调用:

来创建注册活动
RegisterActivity registerActivity = new RegisterActivity();

据我了解,您有注册活动,您在列表中填充了您的用户。然后,移至要访问此特定列表的所有用户活动。如果是这种情况,您只需通过即可将列表传递给AllUser活动,

intent.putStringArrayListExtra()

答案 2 :(得分:1)

导航到其他活动时(未通过捆绑传递此数据)实际上是在丢失数据

尝试将用户名保存在另一个拥有此列表的常规类中(使用单例模式),然后您就可以获取此数据了 OR 捆绑-首选方式。

答案 3 :(得分:1)

问题不是在何处访问数组列表类,而是何时访问它。更具体地说,当您将其传递给其他活动时。

在您当前的代码中,到for(String n : muserNames)运行时,userNames.add(userName)尚未运行。要了解有关原因的更多信息,请阅读:getContactsFromFirebase() method return an empty list

要解决此问题,您需要在开始新活动之前确保已读取所有数据。最简单的方法是:

  1. 使用ValueEventListener而不是ChildEventListener,以便在一次调用onDataChange时获得所有数据。
  2. 然后从onDataChange开始其他活动。

在代码中,类似于:

FirebaseDatabase.getInstance().getReference("User_data").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            userName = snapshot.child("name").getValue().toString();
            Log.d("TaguserName", userName);
            userNames.add(userName);
            for(String user_Name : userNames)
            Log.d("TagArrayList", user_Name);
        }
        Intent intent = new Intent(getApplicationContext(), AllUsers.class);
        intent.putExtra("From", "Register");
        startActivity(intent);
        finish();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
}
相关问题