【问题标题】:ArrayList loses elements after onChildAdded (Android Studio & Firebase)ArrayList 在 onChildAdded 之后丢失元素(Android Studio 和 Firebase)
【发布时间】:2017-08-18 16:03:10
【问题描述】:
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() 方法时,我丢失了 universitylist 和 arrayofUniversities 中的每个元素,即使我的微调器中填充了这些元素。

这很奇怪,因为列表应该存储对象。

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

【问题讨论】:

  • 你确定你从 firebase 获取数据???
  • 是的,非常确定。数据显示在微调器中。另外,当我取消注释日志时,它会显示正在添加到列表中的数据。一旦它离开方法,虽然列表为空
  • 您的支持代码在哪里?也许会出现问题。
  • 支持代码是什么意思?
  • “我将大学对象存储在大学列表中”,这行是什么意思

标签: android database firebase


【解决方案1】:

试试这个方法。希望它会工作.. :)

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) {

    }
});

【讨论】:

  • 我会得到一个 0 大小的数组列表
【解决方案2】:

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

@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) {
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2016-06-09
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多