[英]How to access an arraylist from another class?
在 class 注冊活動中,我創建了 ArrayList,並且日志顯示它正在被填充。 但是當我在 AllUsers class 中訪問它時,它是空的。
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() 在所有用戶 class 中訪問這個 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();
}
}
}
私有 static ArrayList 用戶名的聲明; 是 static。 這意味着您可以使用直接訪問 arraylist
RegisterActivity.userNames
不使用訪問器方法(get..)。 您無需實例化 RegisterActivity 即可訪問 arraylist。 因此
adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, RegisterActivity.userNames);
如果您想保持使用getUserNames() ,則將其聲明為 static 並通過 class 名稱調用它。
您不能通過簡單地調用來創建您的注冊活動:
RegisterActivity registerActivity = new RegisterActivity();
據我了解,您有您的注冊活動,您可以在列表中填充您的用戶。 然后,您將轉到您正在訪問此特定列表的所有用戶活動。 如果是這種情況,您可以簡單地將您的列表傳遞給您的 AllUser 活動,
intent.putStringArrayListExtra()
在導航到其他活動(不通過捆綁傳遞此數據)時,您實際上正在丟失此數據
嘗試將用戶名保存在另一個包含此列表的常規 class (使用 singleton 模式)中,然后您將能夠獲取此數據或通過捆綁傳遞此數據 - 首選方式。
問題不在於您訪問數組列表 class 的位置,而在於您訪問它的時間。 或者更具體地說,當你把它傳遞給其他活動時。
在您當前的代碼中,當您的for(String n: muserNames)
運行時,還沒有一個userNames.add(userName)
運行。 要了解有關原因的更多信息,請閱讀: getContactsFromFirebase() 方法返回一個空列表
要解決此問題,您需要確保在開始新活動之前讀取所有數據。 最簡單的方法是:
ValueEventListener
而不是ChildEventListener
,以便在一次調用onDataChange
中獲取所有數據。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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.