使用FirebaseUI无法实时调用FirebaseDatabase的值。

问题描述 投票:0回答:1

enter image description here

以上只是FirebaseDatabase中文件夹结构的一个例子。我的疑问是,我应该如何获取这些子节点的值。

下面是我试过的代码。

//FirebaseDatabase Collecting all the Item List
    ValueEventListener listener= new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()){

                for (DataSnapshot ds: dataSnapshot.getChildren()){
                    arrayItemList.add(ds.getKey());
               }

                firebaseRecyclerViewItem(arrayItemList);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

            Log.i(TAG, "onCancelled: Unable to fetch data");

        }
    };
    lookUpDatabase.addValueEventListener(listener);

这是方法firebaseRecyclerViewItem()的代码。

public void firebaseRecyclerViewItem(final ArrayList<String> arrayItemList) {
    DatabaseReference reference = null;
    String referenceName = null;

    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //FirebaseDatabase 2'nd Reference Address
            for (DataSnapshot ds : dataSnapshot.getChildren()) {

                String key1 = ds.getKey();
                Log.i(TAG, "onDataChange: " + key1);

                String firebaseItemName = ds.child("DATA").getValue(String.class);
                Log.i(TAG, "onDataChange: " + firebaseItemName);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };

    for (int i = 0; i < arrayItemList.size(); i++) {

        referenceName = arrayItemList.get(i);
        reference = FirebaseDatabase.getInstance().getReference().child("DATA").child(referenceName);
        reference.addValueEventListener(valueEventListener);

        //Loading RecyclerView
        RecyclerViewItemList(reference, referenceName);
    }

}

并不是说我不能得到这些值,我是可以得到的,但是在我所附的数据库图片中,有三个FILE01,FILE02和FILE03。我只能得到最后一个FILE03,"01 "的值,我的意思是ValueEventListner跳过所有其他FILE,只取最后更新或最后一个文件。但我希望所有的文件数据都能显示在我的recyclerView上。

我也尝试了不同的方法,我得到DataSnaphot,并使用for()Loop,在那里我使用嵌套循环。

//FirebaseDatabase Collecting all the Item List
    ValueEventListener listener= new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()){

                // here is where the changes which I have made, I tried to called the value which is impossible but still I tried to, but not result.

                for (DataSnapshot ds: dataSnapshot.getChildren()){

                   String key= ds.getKey();
                    String firebaseItemName = ds.child("DATA").getValue(String.class);
                Log.i(TAG, "onDataChange: " + firebaseItemName);

                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

            Log.i(TAG, "onCancelled: Unable to fetch data");

        }
    };
    lookUpDatabase.addValueEventListener(listener);

    RecyclerViewItemList(lookUpDatabase);

有什么方法可以让我调用这些值吗?

android firebase firebase-realtime-database firebaseui
1个回答
1
投票

你应该调用"/FirebaseDatabase ... notifyDataSetChanged()循环. 否则,你的 参考参考名 将被重写。

所以你的代码应该是

 for (int i = 0; i < arrayItemList.size(); i++){
//Add your data to arraylist

rvAdapter.notifyDataSetChanged();
}

编辑:

这将显示你的火库数据。我只是改变了你的第二种方法。

/*I changed Here*/
 private ArrayList<HashMap<String,String>> yourChildList = new ArrayList<>();

 ValueEventListener listener= new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        if (dataSnapshot.exists()){


            for (DataSnapshot ds: dataSnapshot.getChildren()){

                /*I changed Here*/
                HashMap<String,String> dataMap = new HashMap<>();


               String key= ds.getKey();
                String firebaseItemName = ds.child("DATA").getValue(String.class);
            Log.i(TAG, "onDataChange: " + firebaseItemName);


            /*I changed Here*/
            dataMap.put(key,firebaseItemName);
            yourChildList.add(yourDataMap);

            }


            /*I changed Here
            *
            *I think this method is used to update data to your recyclerView
            *if I'm right, you can replace it
            *RecyclerViewItemList(lookUpDatabase);
            *
            */ 

            yourRecyclerAdapter = new RecyclerAdapter(yourChildList);
            yourRecyclerAdapter.notifyDataSetChanged();
            recyclerView.setAdapter(yourRecyclerAdapter);

        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.i(TAG, "onCancelled: Unable to fetch data");
    }
};
lookUpDatabase.addValueEventListener(listener);

注意我不建议你使用嵌套监听器。为了更好的性能和可维护性,你应该避免使用嵌套监听器。你应该使用 观察家实时数据 以更新Recyclerview。

© www.soinside.com 2019 - 2024. All rights reserved.