【问题标题】:Why my Firebase addvalueEventlistener won't get called?为什么我的 Firebase addvalueEventlistener 不会被调用?
【发布时间】:2020-06-12 06:33:27
【问题描述】:

目前,我正在编写一个社交媒体应用程序,现在我想从我的 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) {
                    //
                }
            });

        }

    }   

...等

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

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

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

    mOnNoteListener=onNoteListener;
    

    但您从不调用接口将值发送到您的视图(在 onDataChange(...) 内部)

    所以,您需要做的是调用您的接口将这些值发送到您的视图

    所以,在您在 Firebase 中获取数据后,请使用您的回调

    mOnNoteListener.yourMethod(your_value);
    

    【讨论】:

    • 是的,你完全正确。但是我在我的另一个类中尝试了这段代码,在那里我从我的火力库中检索其他数据,另一个 addvalueListener 工作,但上面那个没有,这将是真正的问题,一般来说可能是什么原因,为什么我的听众不会被调用。 (我的意思是代码很好,这个地方是我猜的问题,或者是一些异步问题。)
    • 那个firebase调用不应该在适配器中,适配器不负责处理异步操作,它只是用已经传递的数据填充视图
    【解决方案2】:

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

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

    ...等

    这个双重 for 循环足以获取父母的 id 和孩子的 id,所以现在我的评分应用程序正在运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-26
      • 2013-07-22
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多