如何解决如何从另一个类访问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(),Toast.LENGTH_LONG).show();
}
}
}
解决方法
私有静态ArrayList userNames; 的声明是静态的。这意味着您可以使用
直接访问arraylistRegisterActivity.userNames
不使用访问器方法(获取..)。您无需实例化RegisterActivity即可访问arraylist。因此
adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,RegisterActivity.userNames);
如果要保持使用 getUserNames(),则也将其声明为静态并通过类名调用。
,您不能仅通过调用:
来创建注册活动RegisterActivity registerActivity = new RegisterActivity();
据我了解,您有注册活动,您在列表中填充了您的用户。然后,移至要访问此特定列表的所有用户活动。如果是这种情况,您只需通过即可将列表传递给AllUser活动,
intent.putStringArrayListExtra()
,
导航到其他活动时(未通过捆绑传递此数据)实际上是在丢失数据
尝试将用户名保存在另一个拥有此列表的常规类中(使用单例模式),然后您就可以获取此数据了 OR 捆绑-首选方式。
,问题不是在何处访问数组列表类,而是何时访问它。更具体地说,当您将其传递给其他活动时。
在您当前的代码中,到for(String n : muserNames)
运行时,userNames.add(userName)
尚未运行。要了解有关原因的更多信息,请阅读:getContactsFromFirebase() method return an empty list
要解决此问题,您需要在开始新活动之前确保已读取所有数据。最简单的方法是:
- 使用
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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。