Java Android Firebase将数据检索回gridView

Java Android Firebase将数据检索回gridView,java,android,Java,Android,我是编程新手,刚开始做我的第一个android项目。我已经陷入这个问题好几个小时了,仍然不知道为什么它不起作用。下面是数据结构 我想为各自的用户添加日志,我实现的addJournal()函数正在运行。但是当我从数据库中检索这些日志到gridView时,它崩溃了 以下是我如何将日记添加到以下数据库: firebaseAuth = FirebaseAuth.getInstance(); firebaseUser = firebaseAuth.getCurrentUs

我是编程新手,刚开始做我的第一个android项目。我已经陷入这个问题好几个小时了,仍然不知道为什么它不起作用。下面是数据结构

我想为各自的用户添加日志,我实现的addJournal()函数正在运行。但是当我从数据库中检索这些日志到gridView时,它崩溃了

以下是我如何将日记添加到以下数据库:

        firebaseAuth = FirebaseAuth.getInstance();
        firebaseUser = firebaseAuth.getCurrentUser();
        journalReference=FirebaseDatabase.getInstance().getReference();

        String journalName = etJournalName.getText().toString().trim();
        String companyName = etCompanyName.getText().toString().trim();
        String journalColor = "blankForNow";
        String userID = firebaseUser.getUid();
        String journalID = journalReference.push().getKey();

        //validation
        if (TextUtils.isEmpty(journalName)){
            etJournalName.setError("Journal name must not be empty");
        } else if (TextUtils.isEmpty(companyName)){
            etCompanyName.setError("Company name must not be empty");
        } else {
            //storing data to the database...
            Journal journal = new Journal(journalID, userID, journalName, companyName, journalColor);
            journalReference.child("users")
                    .child(userID)
                    .child("journals")
                    .child(journalID).setValue(journal);
        }
下面是我检索数据的方法:

    DatabaseReference journalRef = 
    FirebaseDatabase.getInstance().getReference();
    journalRef.child("users")
    .child(userID)
    .child("journals").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            journalArrayList.clear();
            for (DataSnapshot journalDS : dataSnapshot.getChildren()) {
                Journal journal = journalDS.getValue(Journal.class);
                journalArrayList.add(journal);
            }
            gridViewAdapter = new GridViewAdapter(MainActivity.this, journalArrayList);
            gridView.setAdapter(gridViewAdapter);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, Strin
有人能帮我吗?
提前感谢

使用
addListener for SingleValueEvent
代替
addChildEventListener

希望这对你有帮助

DatabaseReference journalRef =FirebaseDatabase.getInstance().getReference();
journalRef.child("users").child(userID).child("journals").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        journalArrayList.clear();
        for (DataSnapshot journalDS : dataSnapshot.getChildren()) {
            Journal journal = journalDS.getValue(Journal.class);
            journalArrayList.add(journal);
        }
        gridViewAdapter = new GridViewAdapter(MainActivity.this, journalArrayList);
        gridView.setAdapter(gridViewAdapter);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
编辑

ValueEventListener
获取单个数据束中的所有数据,其中as
ChildEventListener
逐个获取特定节点的数据记录。 我建议你试试。为每个
ValueEventListener
ChildEventListener
创建一个代码段,检查行为

编辑1

您获得NullPointerException只是因为您没有初始化
journalArrayList
列表

初始化您的列表

journalArrayList=new ArrayList<>()
journalArrayList=newArrayList()
编辑2您可以使用下面的“地图尝试”解决方案获取值

for (DataSnapshot journalDS : dataSnapshot.getChildren()) {
    Map<String, String> map = (Map<String, String>) journalDS.getValue();
    String journalName = map.get("journalName");
    String companyName = map.get("companyName");
    String journalColor = map.get("journalColor");
    String userID = map.get("userID");
    String journalID = map.get("journalID");
    Journal journal = new Journal(journalID, userID, journalName, companyName, journalColor);
    journalArrayList.add(journal);
}
for(DataSnapshot日志:DataSnapshot.getChildren()){
Map Map=(Map)journalDS.getValue();
字符串journalName=map.get(“journalName”);
字符串companyName=map.get(“companyName”);
字符串journalColor=map.get(“journalColor”);
字符串userID=map.get(“userID”);
字符串journalID=map.get(“journalID”);
日记账=新日记账(journalID、userID、journalName、companyName、journalColor);
journalArrayList.add(日记账);
}

使用Get和set方法尝试以下代码

public class Journal {
    private String journalID;
    private String userID;
    private String journalName;
    private String companyName;
    private String journalColor;

    public Journal() {
    }

    public Journal(String journalID, String userID, String journalName, String companyName, String journalColor) {
        this.journalID = journalID;
        this.userID = userID;
        this.journalName = journalName;
        this.companyName = companyName;
        this.journalColor = journalColor;
    }

    public String getJournalID() {
        return journalID;
    }

    public void setJournalID(String journalID) {
        this.journalID = journalID;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public String getJournalName() {
        return journalName;
    }

    public void setJournalName(String journalName) {
        this.journalName = journalName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getJournalColor() {
        return journalColor;
    }

    public void setJournalColor(String journalColor) {
        this.journalColor = journalColor;
    }
}

D/Journal:=>DataSnapshot{key=-ksvqm79ass1bpugngb,value={userID=qazq0h3e8oaun09skg0hwhffdt2,journalName=Journals001,journalID=-ksvqm79ass1bpugngb,companyName=com001,journalColor=blankForNow} 09-01 21:20:20.364 30374-30374/com.colla.sdpjournal D/Journal:=>DataSnapshot{key=-KsvzWaNFsYX488MLSIK,value={userID=qAzq0h3E8oaUn09SkG0hWhFfTDT2,journalName=Journal007,journalID=-KsvzWaNFsYX488MLSIK,companyName=com007,journalColor=blankForNow} 09-01 21:20:20.364 30374-30374/com.colla.sdpjournal D/Journal:=>DataSnapshot{key=-ksvzdirgwfgfg3dalxyt1,value={userID=qAzq0h3E8oaUn09SkG0hWhFfTDT2,journalName=Journal008,journalID=-KsvzdIrgwFG3DaLXyt1,companyName=com008,journalColor=blankForNow} 09-01 21:20:20.365 30374-30374/com.colla.sdpjournal D/Journal:=>DataSnapshot{key=-kswcfyiifhfhfhfhf--smTXxu,value={userID=qAzq0h3E8oaUn09SkG0hWhFfTDT2,journalName=Journals008,journalID=-kswcfyiifhfhfhff--smTXxu,companyName=com008,journalColor=blankForNow}}
09-01 21:20:20.365 30374-30374/com.colla.sdpjournal D/Journal:==>DataSnapshot{key=-KswV-o82jgtoarr6bk,value={userID=qAzq0h3E8oaUn09SkG0hWhFfTDT2,journalName=journal009,journalID=-KswV-o82jgtoarr6bk,companyName=com009,journalColor=blankForNow}

可以在这里发布错误日志吗?请发布错误日志。提前谢谢!只需找出在哪里可以找到日志…java.lang.NullPointerException:尝试在com.colla.sdpjournal.MainActivity$1.onChildaded(MainActivity.java:75)上的空对象引用上调用虚拟方法'void java.util.ArrayList.clear()@Jamen检查我的答案编辑1致命异常:主进程:com.colla.sdpjournal,PID:5840 java.lang.NullPointerException:尝试调用虚拟方法'void java.util.ArrayList.clear()'在com.colla.sdpjournal.MainActivity$1.onDataChange(MainActivity.java:75)@Jamen上的空对象引用上,由于没有初始化journalArrayList.clear(),您将获得空指针错误@akhilesh0707我解决了这个问题,就像你说的,将addChildEvent更改为addValueEvent。。。谢谢