当前,我正在编写一个社交媒体应用程序,现在我想从我的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) {
//
}
});
}
}
...等等
答案 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,因此现在我的评级应用正在运行。