#android #firebase #firebase-realtime-database
# #Android #firebase #firebase-база данных в реальном времени
Вопрос:
Я новичок в Android, и я знаю, что это может быть проще простого, но я борюсь.
Я пытался создать динамическое расширяемое представление recycler с использованием базы данных firebase в реальном времени, но данные отображаются неправильно.
Я передаю строку из одного действия в другое и сравниваю строку с полем базы данных, а затем отображаю ее дочерние компоненты, но я не знаю, где я терплю неудачу.
Я хочу отобразить родительское и дочернее поля, сравнив поле name со значением.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_course_detail);
//string value from another activity
String value = getIntent().getExtras().getString("name");
recycler_view = (RecyclerView) findViewById(R.id.recycler_expand);
recycler_view.setLayoutManager(new LinearLayoutManager(this));
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference parentReference = database.getReference().child("Tutors");
//comparing
parentReference.equalTo(value).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<ParentList> Parent = new ArrayList<>();
for (final DataSnapshot snapshot : dataSnapshot.getChildren()){
final String ParentKey = snapshot.getKey().toString();
snapshot.child("title").getValue();
DatabaseReference childReference =
FirebaseDatabase.getInstance().getReference().child(ParentKey);
childReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final List<ChildList> Child = new ArrayList<>();
for (DataSnapshot snapshot1:dataSnapshot.getChildren())
{
final String ChildValue = snapshot1.getValue().toString();
snapshot1.child("title").getValue();
Child.add(new ChildList(ChildValue));
}
Parent.add(new ParentList(ParentKey, Child));
DocExpandableRecyclerAdapter adapter = new DocExpandableRecyclerAdapter(Parent);
recycler_view.setAdapter(adapter);
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
System.out.println("Failed to read value." error.toException());
}
});}}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
ChildList.java
public class ChildList implements Parcelable {
private String title;
public ChildList(String title) {
this.title = title;
}
protected ChildList(Parcel in) {
title = in.readString();
}
public static final Creator<ChildList> CREATOR = new Creator<ChildList>() {
@Override
public ChildList createFromParcel(Parcel in) {
return new ChildList(in);
}
@Override
public ChildList[] newArray(int size) {
return new ChildList[size];
}
};
public String getTitle() {
return title;
}
public void setTitle(String Title) {
this.title = Title;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(title);
}
}
Пожалуйста, кто-нибудь, помогите мне с этим: (
Комментарии:
1. Строковое значение = GetIntent().getExtras().getString(«имя»); является родительским именем?
2. @Hard’Kgosai Это значение, которое я извлекаю из другого действия.
3. snapshot.child(«title»).GetValue(); Что это?
4. @Hard’Kgosai snapshot.child(«title»).GetValue(); является переменной в классе childList
5. Да, но где вы сохранили это значение? к нему не прикреплена строка, подобная этой String string = .snapshot.child(«title»).GetValue().toString();
Ответ №1:
Не используйте equalTo().
Попробуйте это:
DatabaseReference parentReference = database.getReference().child("Tutors");
parentReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (final DataSnapshot snapshot : dataSnapshot.getChildren()){
final String NameKey = snapshot.getKey().toString();
if(value.equals(NameKey)){
//DO WHATEVER YOU WANT
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});