在onChildAdded(Android Studio& Firebase)之后,ArrayList丢失了元素

时间:2017-08-18 16:03:11

标签: android database firebase

public void readUniversity(){
    ChildEventListener uniListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //Log.d(LOG_TAG, dataSnapshot.getKey());
            University uni = dataSnapshot.getValue(University.class);
            universitieslist.add(uni); //Adding to an ArrayList of type University
            //Log.d(LOG_TAG, universitieslist.size()+"is the size");
            arrayofUniversities.add(uni.getName()); //Adding name of University to list
            //Log.d(LOG_TAG, adapter.getCount() + " items");
            //Log.d(LOG_TAG, arrayofUniversities.size()+" is the size");
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    DatabaseReference uniReference = database.getReference("note-retrieve/Universities");
    uniReference.addChildEventListener(uniListener);
}

代码几乎是自我解释的。我正在使用arrayofUniversities列表来填充微调器,所以我需要一个适配器。我用大学的名字填充微调器

我将大学对象存储在大学列表中

我遇到的问题是当我离开readUniversity()方法时,即使我的微调器填充了这些元素,我也会失去大学列表和arrayofUniversities中的所有元素。

它非常奇怪,因为列表应该存储对象。

另外,我的适配器位于onCreate()代码的最顶层。

2 个答案:

答案 0 :(得分:0)

试试这种方式。希望它能起作用.. :)

private Arrylist<University > universityList = new ArryList<>();
private Arrylist<String> universitysName = new ArryList<>();

 mDatabase.getReference().child("path")
            .addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        if (dataSnapshot != null) {
            University mUniversity  = dataSnapshot.getValue(University 
                                        .class);
            universityList.add(mUniversity);
            universitysName.add(mUniversity.getName);

        }
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

答案 1 :(得分:0)

问题似乎与适配器有关,如果您可以看到日志但适配器未更新,那么是因为未通知适配器数据集已更改

@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    if (dataSnapshot != null) {
        University mUniversity  = dataSnapshot.getValue(University 
                                    .class);
        universityList.add(mUniversity);
        universitysName.add(mUniversity.getName);
        //UPDATE YOUR ADAPTER HERE
        //spinnerAdapter.notifyDataSetChanged();

    }
}

但我认为真正的问题是你当前问题的根源:你得到每个孩子。这是一种方法,但是对于这种情况,您首先需要所有数据,并且在准备就绪时向用户显示带有元素的微调器,您最好在一个查询中获取所有列表元素。

database.getReference("note-retrieve/Universities")..addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    University mUniversity  = dataSnapshot.getValue(University 
                                .class);
    universityList.add(mUniversity);
    universitysName.add(mUniversity.getName);
      //ONCE THIS IS DONE, THEN PASS THE ARRAY TO THE ADAPTER
                }
      //The loop here is over, so you can set the adapter with the full list of data/universities
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });