2016-11-30 124 views
0

我正在做一個Android應用程序。我已成功寫入Firebase,但是我從Firebase讀取ListView時遇到問題。如果任何人都可以幫助將數據讀迴應用程序到ListView中,如果我只有一個項目嘗試讀取它,如果我嘗試獲取應用程序失敗的所有三個項目,它將起作用。 我已經包含了數據庫的圖片以瞭解結構和我的代碼。如何將Firebase數據導入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

代碼有什麼問題?我很快看到的唯一情況是,你無法在'onDataChange()'中調用'arrayAdapter.notifyDataSetChanged()'。我還建議使用'ChildEventListener',因爲這樣可以更細化地更新列表視圖,從而減少屏幕閃爍。 –

+0

@FrankvanPuffelen嗨,我想要發生的是讓每個項目都在自己的列表中,因爲Firebase中的每個項目都成爲它自己的項目。例如,第一個鍵必須將3個項目分組並顯示。 –

+0

聽起來像一個明確的用例。什麼對當前的代碼不起作用? –

回答

1

可以使用Firebase UI library

只需添加相關性:

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

然後定義一個簡單的類來映射你的對象:

public class MyObject { 

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

    public MyObject() { 
    } 
    .... 

} 

然後,只需使用類似:

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

嗨,除了使用Firebaseui之外沒有別的方法,因爲我嘗試過使用Firebase UI,它似乎在應用程序中導致問題。 –

+0

@ JNR_Prog123您必須根據應用中使用的Firebase版本選擇正確的版本。 它只是一個適配器,僅此而已:https://github.com/firebase/FirebaseUI-Android/blob/master/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java –

1

使用ChildEventListener放你的這個代碼:
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String(this,android.R.layout.simple_list_item_1, mMeetings); mListView.setAdapter(arrayAdapter);

的onChildAdded內....
此外科瑞Model類擺脫火力 公共類用戶{公共字符串名稱的數據;公共字符串日期;公共字符串的時間; //呼叫需要
// DataSnapshot.getValue(User.class) public User() {}public User(String name, String time, String date) {this.name = name; this.time= time;this.date=date;}默認的構造
感謝它會幫助你..