为什么我的Firebase addvalueEventlistener不会被调用?

时间:2020-06-10 18:02:39

标签: java android firebase firebase-realtime-database

当前,我正在编写一个社交媒体应用程序,现在我想从我的Firebase数据库中检索数据,其中每个用户都有一定的评分。 mUploads-存储已上传的项目(照片,名称,城市,ID)。 mDatabaseRef-ratings-存储已上传项目的评级(某些项目尚未评级)。它们具有相同的ID,就像在mUploads-> ID

中一样

这实际上是一个很大的项目,我已经多次检索了其他类型的firebase元素,但是这次addvalueventlistener不会被调用,我也无法弄清楚。为什么?

这不是全部代码,但主要部分是这个。我尝试了几种方法,但没有任何帮助。我不仅尝试在此适配器类中调用它,还尝试在其他类中调用它,在该类中检索mUploads列表的数据。

...

public class ProfileAdapter extends RecyclerView.Adapter<ProfileAdapter.ImageViewHolder> implements Filterable {
    private Context mContext;
    private List<Upload> mUploads;
    private List<Upload> exampleListFull;
    private OnNoteListener mOnNoteListener;
    private ArrayList<Ratingsclass> mratings_array;
    public float sumofstars, numofratings, defaultstars;
    private DatabaseReference mDatabaseRef_ratings;

    public ProfileAdapter(Context context, List<Upload> upload, OnNoteListener onNoteListener){//, ArrayList<Ratingsclass> ratinglist){
        mContext=context;
        mUploads=upload;
        exampleListFull=new ArrayList<>(upload);
        mOnNoteListener=onNoteListener;

        for (int i = 0; i < mUploads.size(); i++){
            mDatabaseRef_ratings = FirebaseDatabase.getInstance().getReference("ratings");
            Log.d("myTag", "loop");
            /*checking if child already exists*/
            mDatabaseRef_ratings=mDatabaseRef_ratings.child(mUploads.get(i).getKey());
            Log.d("myTag", "ez az id: "+ mUploads.get(i).getKey());

            final int finalI = i;
            mDatabaseRef_ratings.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (dataSnapshot.getValue() == null) {
                        // The child doesn't exist
                        Log.d("myTag", "has no rating");
                    }else{
                        mDatabaseRef_ratings = FirebaseDatabase.getInstance().getReference("ratings").child(mUploads.get(finalI).getKey());
                        Log.d("myTag", "checking the elements of this child");
                        mDatabaseRef_ratings.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                Ratingsclass temp = new Ratingsclass();
                                numofratings = 0;
                                sumofstars = 0;
                                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                                    temp = postSnapshot.getValue(Ratingsclass.class);
                                    numofratings += 1;
                                    sumofstars += temp.getNum_of_stars();
                                    Log.d("myTag", numofratings + " es " + sumofstars);
                                }
                                if (numofratings == 0)
                                    defaultstars = 0;
                                else
                                    defaultstars = sumofstars / numofratings;
                                temp.setRatingid(mUploads.get(finalI).getKey());
                                temp.setRating_sum(defaultstars);
                                mratings_array.add(temp);
                            }

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

                            }
                        });
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    //
                }
            });

        }

    }   

...等等

2 个答案:

答案 0 :(得分:3)

如果将侦听器传递给适配器onNoteListener的构造函数,则您应该在活动/片段中侦听此接口所做的更改。

在代码中,您将在适配器内部使用

mOnNoteListener=onNoteListener;

但是您永远不会调用接口将值发送到视图(在onDataChange(...)内部)

因此,获取这些值所需要做的就是调用您的界面以将这些值发送到视图中

因此,在Firebase中获取数据后,请使用回调

mOnNoteListener.yourMethod(your_value);

答案 1 :(得分:0)

在另一个主题的帮助下,我可以设法解决。我刚刚添加了以下代码:

mDatabaseRef_ratings.child("ratings").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (final DataSnapshot entrySnapshot : dataSnapshot.getChildren()) {
                    alreadyrated=false;
                    for (DataSnapshot propertySnapshot : entrySnapshot.getChildren()) {
                        Log.d("myTag", entrySnapshot.getKey() + " : " + propertySnapshot.getKey());

...等等

此double for循环足以获取父代的ID和子代的ID,因此现在我的评级应用正在运行。

相关问题