我有两个查询,它们来自不同的源(都是firebase数据库实时),我希望它们出现在我的FirebaseRecyclerAdapter中。我已经对这个特定的问题绞尽脑汁了一段时间,但我什么也想不出来。
我如何实现这一点并将其合并到下面的代码中。
喜欢JSON结构
"Likes" : {
"-LAJRnaAaCGrbv8-cXvD" : {
"5SWi7kiLTdW4WS1MDV5Knxeo0qt1" : {
"-LDqyWmTa-sbgKpxOztv" : {
"Likes" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1"
}
},
"6Zv4wIWV3WOyHxgABXkecK18IJ03" : {
"-LDlj87M--DZVBgBJTUT" : {
"Likes" : "6Zv4wIWV3WOyHxgABXkecK18IJ03"
}
},
"ktLMV4x9kGN43Ggrx5YWhkaG7BL2" : {
"-LDkQ-jAwb7oI3N4T__R" : {
"Likes" : "ktLMV4x9kGN43Ggrx5YWhkaG7BL2"
}
}
}
},
食谱JSON结构
"PostRecipe" : {
"-LAJRnaAaCGrbv8-cXvD" : {
"appetizer" : "Appetizer",
"cooking_time" : "40 mins",
"desert" : "Dessert",
"difficult_level" : "5",
"main_course" : "Main course",
"name" : "Smokey Party Jollof",
"number_of_people" : "5",
"photo1" : "https://firebasestorage.googleapis.com/v0/b/chefcook-1865d.appspot.com/o/recipe_photos%2F43262?alt=media&token=07103c5d-9924-4e02-985c-fbc02920228f",
"photo2" : "https://firebasestorage.googleapis.com/v0/b/chefcook-1865d.appspot.com/o/recipe_photos%2F43237?alt=media&token=1d398256-0058-4f78-a13f-66301acc4f75",
"photo3" : "something",
"photo4" : "something",
"pizza_fritas" : "Pizza, fritas",
"prepare_time" : "3hrs",
"side_dish" : "Side dish",
"tips" : "Blended stew base is the best base for making traditional stew.",
"userId" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1",
"vegetarian" : "Vegetarian"
}
}
},
MainRecipeFragment.java
...
mDatabase = FirebaseDatabase.getInstance().
getReference().child("Post").child("PostRecipe").orderByChild("photo1").startAt(n);
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
mAdapter = new FirebaseRecyclerAdapter<RecipeModel, NewViewHolder>(RecipeModel.class, R.layout
.activty_content_list,
NewViewHolder.class, mDatabase) {
@Override
protected void populateViewHolder(final NewViewHolder viewHolder, final RecipeModel model,
final int
position) {
final DatabaseReference postRef = getRef(position);
Log.e(TAG , "adpter" + model.getName() + model.getPhoto1());
// Set click listener for the whole post view
final String cheeseKey = postRef.getKey();
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Launch PostDetailActivity
Intent intent = new Intent(getActivity(), RecipeDetails.class);
intent.putExtra(RecipeDetails.EXTRA_CHEESE_KEY, cheeseKey);
startActivity(intent);
}
});
// Bind Post to ViewHolder
Context context = getActivity();
viewHolder.bindToCheese(model, context);
}
};
ViewHolder
public class ViewHolder extends RecyclerView.ViewHolder {
String LOG_TAG = ViewHolder.class.getSimpleName();
private View mView;
private ImageView mImageView;
private TextView mTextView;
private static final String TAG = ViewHolder.class.getSimpleName();
public ViewHolder(View view) {
super(view);
mView = view;
mImageView = view.findViewById(R.id.soup_thumbnail);
mTextView = view.findViewById(R.id.soup_title);
//getActivity();
}
public void bindToCheese(Cheeses cheeses, Context c) {
mTextView.setText(cheeses.getTitle());
Log.d(TAG, "title"+ cheeses.getTitle());
Picasso.with(c).load(String.valueOf(cheeses.getImagerUrl())).placeholder(R.mipmap.ic_launcher).fit().into(mImageView);
Log.e(LOG_TAG, "imageurl"+ cheeses.getImagerUrl() + " title" + cheeses.getTitle()) ;
//Here, how do i reach Like and extract information inside.
//I tried the below log, but it is returning null
Log.e(LOG_TAG, "likes"+ cheeses.getLikes());
}
发布于 2018-06-01 03:03:50
你正在以一种关系的方式思考你的数据库,简单地做就行了,而不是循环2次并得到2个查询,你可以用1个方法就能完成。(这就是为什么firebase结构可以轻松做到这一点)
例如,假设你有菜谱和喜欢,你可以有每个喜欢的内部菜谱,然后循环一次进入那个表,获得喜欢,获得食谱,并在你的回收视图中在一个循环中显示它,不需要考虑查询两个不同的节点。
所以,我建议你在你的数据库中做一个重构,把喜欢放在每个食谱里,然后只循环一次。
例如,您可以使用以下代码
"Likes" : {
"-LAJRnaAaCGrbv8-cXvD" : {
"5SWi7kiLTdW4WS1MDV5Knxeo0qt1" : {
"-LDqyWmTa-sbgKpxOztv" : {
"Likes" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1"
}
这个like对应于这个食谱
"PostRecipe" : {
"-LAJRnaAaCGrbv8-cXvD" : {
"appetizer" : "Appetizer",
"cooking_time" : "40 mins",
"desert" : "Dessert",
"difficult_level" : "5",
"main_course" : "Main course",...
因此,只需在pushID
中添加like,您就可以在PostRecipe
中包含您配方和该配方的类似内容,这样您就只需循环一次,并通过一次查询遍历所有配方
这就是你需要做的
"PostRecipe" : {
"-LAJRnaAaCGrbv8-cXvD" : {
"appetizer" : "Appetizer",
"likes":{
"5SWi7kiLTdW4WS1MDV5Knxeo0qt1" : {
"-LDqyWmTa-sbgKpxOztv" : {
"Likes" : "5SWi7kiLTdW4WS1MDV5Knxeo0qt1"
}
"cooking_time" : "40 mins",
"desert" : "Dessert",
"difficult_level" : "5",
"main_course" : "Main course",...
然后,使用这种结构,只需查询表一次,您就可以获得每个食谱的相似信息。
在你的RecipeModel中,你应该有你所需要的所有变量的setter和getter,例如name,appetizers,photo1等等,请确保变量的名称与firebase数据库中的名称相同。
因此,要获取数据,您应该这样做
请记住,您的mRef应该从您的UserID级别开始。这就是mRef.child("PostRecipe").child(uid).addValue....
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
try {
for(DataSnapshot snap : dataSnapshot.getChildren())
RecipeModel rm = snap.getValue(RecipeModel.class);
String name =rm.getName();
String name =rm.getAppetizer();
//and then just create a new variable likes in your POJO
String likes = rm.getLikes();
//and then do whatever you want with the data, remember that forEach will iterate through all the recipes for each user, and then you can get any field inside your users
}
}catch (Exception ex){
// Toast.makeText(FacultiesActivity.this, ex.toString(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(DatabaseError error) {
Toast.makeText(FacultiesActivity.this, "Error", Toast.LENGTH_LONG).
});
https://stackoverflow.com/questions/50629565
复制相似问题