首页 > 解决方案 > 如何从另一个类访问数组列表?

问题描述

在 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();
        }
    }
}

标签: javaandroidfirebasearraylist

解决方案


私有静态ArrayList userNames的声明;是静态的。这意味着您可以使用直接访问数组列表

RegisterActivity.userNames

不使用访问器方法(get..)。您无需实例化 RegisterActivity 即可访问数组列表。因此

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

如果您想保持使用getUserNames(),那么也将其声明为静态并通过类名调用它。


推荐阅读