2016-11-30 29 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;}默认的构造
感谢它会帮助你..