Невозможно вызвать значения из FirebaseDatabase в реальном времени с помощью FirebaseUI - PullRequest
0 голосов
/ 30 мая 2020

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

}

Это не значит, что я не могу получить значения, я могу получить их, однако в прикрепленной мной базе данных pi c есть три FILE01, FILE02 и FILE03. Я могу получить только последнее FILE03, значение "01", я имею в виду, что ValueEventListner пропускает все остальные ФАЙЛЫ, которые там есть, только последнее обновление или последний файл. Но я хочу, чтобы все данные о файлах отображались в моем recyclerView.

Я также пробовал другой подход, когда я получаю DataSnaphot, и использую for () L oop, где я использовал вложенные l oop:

//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);

Есть ли способ или метод, который я могу использовать для вызова значений.

1 Ответ

1 голос
/ 30 мая 2020

Вы должны вызвать notifyDataSetChanged () в для l oop. В противном случае ваши ссылка и referenceName будут переписаны.

Таким образом, ваш код должен быть

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

rvAdapter.notifyDataSetChanged();
}

Edit :

Это покажет ваши данные firebase. Я только что изменил ваш второй метод.

/*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);

Примечание : я не рекомендую вам использовать вложенные слушатели. Вам следует избегать вложенного прослушивателя для повышения производительности и удобства обслуживания. Вы должны использовать Observer или LiveData для обновления Recyclerview.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...