2016-11-30 2 views
0

Ich mache eine Android App. Es ist mir gelungen, an Firebase zu schreiben. Ich habe jedoch Probleme beim Lesen von Firebase in einem ListView. Wenn jemand helfen kann, die Daten zurück in die App in den ListView zu bekommen, Wenn ich nur einen Gegenstand habe, um zu versuchen und zurück zu lesen, funktioniert es, wenn ich versuche, alle drei Gegenstände zu bekommen, die die App fehlschlägt. Ich habe ein Bild von der Datenbank eingefügt, um eine Vorstellung von der Struktur und meinem Code zu bekommen.Wie erhalte ich Firebase-Daten in einen ListView?

enter image description here

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

import com.firebase.client.DataSnapshot; 
import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 
import com.firebase.client.ValueEventListener; 
import com.google.firebase.database.DatabaseError; 
import com.google.firebase.database.FirebaseDatabase; 

import java.util.ArrayList; 

public class Admin_ViewEvent extends AppCompatActivity { 

    // private TextView textViewPersons; 
private ListView mListView; 
private ArrayList<String> mMeetings = new ArrayList<>(); 
private Firebase mRef; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_admin__view_event); 

    mRef = new Firebase("https://saica-sgb-77a4f.firebaseio.com/Meetings"); 
    mListView = (ListView) findViewById(R.id.ListView); 
    //textViewPersons = (TextView) findViewById(R.id.textViewPersons); 

    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMeetings); 
    mListView.setAdapter(arrayAdapter); 

    mRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) 
     { 
      for(DataSnapshot childSnapShot : dataSnapshot.getChildren()) { 

       String date = (String) childSnapShot.child("address").getValue(); 
       String datetime = (String) childSnapShot.child("datetime").getValue(); 
       String name = (String) childSnapShot.child("name").getValue(); 

       mMeetings.add(date); 
       mMeetings.add(datetime); 
       mMeetings.add(name); 

      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
      System.out.println("The read failed: " + firebaseError.getMessage()); 
     } 
    }); 

} 
} 
+0

Was ist das Problem mit dem Code? Das einzige, was ich schnell sehe, ist, dass Sie 'arrayAdapter.notifyDataSetChanged() 'nicht in' onDataChange() 'aufrufen. Ich würde auch empfehlen, einen 'ChildEventListener' zu verwenden, da Sie damit die Listenansicht detaillierter aktualisieren und somit weniger Bildschirmflimmern erhalten. –

+0

@FrankvanPuffelen Hallo, was ich möchte passieren, ist jedes Element in einer eigenen Liste, wie jedes Element in der Firebase ein eigenes Element wird. ZB die erste Taste die 3 Elemente müssen gruppiert und angezeigt werden. –

+0

Klingt wie ein klarer Anwendungsfall. Was funktioniert nicht am aktuellen Code? –

Antwort

1

können Sie die Firebase UI library verwenden.

Fügen Sie einfach die Abhängigkeit:

dependencies { 
    // FirebaseUI Database only 
    compile 'com.firebaseui:firebase-ui-database:1.0.1' 
} 

Dann eine einfache Klasse definieren Ihr Objekt abbilden:

public class MyObject { 

    private String name; 
    private String address; 
    private String dateTime; 

    public MyObject() { 
    } 
    .... 

} 

Dann benutzen Sie einfach so etwas wie:

mRef = new Firebase("https://saica-sgb-77a4f.firebaseio.com/Meetings"); 
mListView = (ListView) findViewById(R.id.ListView); 
mAdapter = new FirebaseListAdapter<MyObject>(this, MyObject.class, R.layout.myLayout, mRef) { 
     @Override 
     protected void populateView(View view, MyObject myObj, int position) { 
      //Set the value for the views 
      ((TextView)view.findViewById(R.id.xxx)).setText(myObj.getName()); 
      //... 
     } 
    }; 
    mListView.setAdapter(mAdapter); 
+0

Hallo, es gibt keinen anderen Weg, als Firebaseui zu benutzen, da ich Firebase UI ausprobiert habe und es Probleme in der App zu verursachen schien. –

+0

@ JNR_Prog123 Sie müssen die richtige Version gemäß der in Ihrer App verwendeten Firebase-Version auswählen. Es ist nur ein Adapter, nichts mehr: https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java –

1

Verwenden ChildEventListener und setzen Ihr dieser Code:
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String(this,android.R.layout.simple_list_item_1, mMeetings); mListView.setAdapter(arrayAdapter);

innerhalb des onChildAdded ....
auch creat Modellklasse Daten von Feuerbasis public class User {public String-Namen zu erhalten; public String Datum; public String Zeit; // Default-Konstruktor für Anrufe erforderlich
// DataSnapshot.getValue(User.class) public User() {}public User(String name, String time, String date) {this.name = name; this.time= time;this.date=date;}
danke es wird Ihnen helfen ..

Verwandte Themen