#android #firebase #android-activity #android-lifecycle
#Android #firebase #android-activity #android-жизненный цикл
Вопрос:
Я создаю приложение для Android, в котором я сохраняю в firebase и показываю список с подпунктами в одном действии и получаю доступ к этому списку в другом действии нажатием кнопки. Я сохранил и показал данные в firebase и в моем первом действии, но я не могу получить этот список в другом действии. Мой код:-
Основное действие:-
public class MainActivity extends AppCompatActivity {
EditText getName, getNum;
Button btn,btnNext;
TextView textView;
ListView listView;
DatabaseReference fb;
List<Contact> contactList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getName = findViewById(R.id.ed1);
getNum = findViewById(R.id.ed2);
textView = findViewById(R.id.text);
btn = findViewById(R.id.btn);
btnNext = findViewById(R.id.btnNext);
listView = findViewById(R.id.listView);
fb = FirebaseDatabase.getInstance().getReference("Contacts");
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent);
finish();
}
});
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addContacts();
}
});
fb.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Contact contact = dataSnapshot.getValue(Contact.class);
contactList.add(contact);
listadapter list = new listadapter(MainActivity.this,contactList);
listView.setAdapter(list);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
notify();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
public void addContacts() {
String name = getName.getText().toString();
String num = getNum.getText().toString();
String id = fb.push().getKey();
Contact contact = new Contact(name,num);
fb.child(id).setValue(contact);
}
}
Обратитесь к классу getters
public class Contact {
String contact;
String name;
public Contact() { }
public Contact(String name, String contact) {
this.name = name;
this.contact = contact;
}
public String getName() {
return name;
}
public String getContact() {
return contact;
}
}
пользовательский класс адаптера
public class listadapter extends ArrayAdapter<Contact> {
private Activity context;
private List<Contact> contactList;
public listadapter(Activity context, List<Contact> contactList) {
super(context,R.layout.list,contactList);
this.context = context;
this.contactList = contactList;
}
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View listViewItem = inflater.inflate(R.layout.list, null, true);
TextView textViewName = listViewItem.findViewById(R.id.name);
TextView textViewContact = listViewItem.findViewById(R.id.num);
Contact contact = contactList.get(position);
textViewName.setText(contact.getName());
textViewContact.setText(contact.getContact());
return listViewItem;
}
}
Действие, в котором я пытаюсь извлечь
public class Main2Activity extends AppCompatActivity {
Button getSub;
List<Contact> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
getSub = findViewById(R.id.getSub);
getSub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Num : " list.get(0).getContact(),Toast.LENGTH_LONG).show();
}
});
}
}
Решение: — Я извлек список непосредственно из firebase, и он работает
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
call = findViewById(R.id.call);
db = FirebaseDatabase.getInstance().getReference("Trusted contacts");
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
msgAll();
for(int i=0;i<ex.size();i ) {
getNum = "tel: " ex.get(i).getmText2();
callAll(getNum);
}
}
}, 500);
}
@Override
protected void onStart() {
super.onStart();
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
ExampleItem contact = dataSnapshot.getValue(ExampleItem.class);
ex.add(contact);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
Комментарии:
1. Есть ли причина, по которой вы используете firebase для этого?
2. «Я не могу получить этот список» не помогает. У вас ошибка? Каково поведение?
3. java.lang. Исключение IndexOutOfBoundsException: Индекс: 0, размер: 0, это ошибка, которую я получаю, когда пытаюсь получить доступ к списку в другом классе из источников получения
4. Если совместное использование между двумя действиями кажется сложным, то есть вероятность, что вам не следует использовать для этого два отдельных действия.
5. Если вы обмениваетесь данными с помощью геттеров, пожалуйста, сделайте свой arraylist статическим или поместите arraylist в putextra activity при запуске activity
Ответ №1:
В Main2Activity
вы создали ссылочную переменную list
как new ArrayList<>()
, но вы никогда ничего к ней не добавляли.
Если вы хотите иметь доступ к данным, вам нужно либо передать их из одного Actvity
в другой, либо сохранить ссылку на них в static
переменной, к которой вы можете получить доступ из обоих классов.
Комментарии:
1. Я извлек список непосредственно из firebase, но спасибо
2. Если вы устранили проблему, пожалуйста, отправьте ответ и примите этот ответ. В противном случае, пожалуйста, укажите, что все еще не так.