我正在开发一个食谱书应用程序。 我的数据结构如下:
Reference
- users
-53
-movies
-id1
(-name
-rating
-ingredients(list)
-recipe
-photo)
-id2 (....)
正确添加数据,但当我使用以下代码进行检索时,应用程序会停止。我的模型类是 Recipe 。
我需要创建一个网格结构来显示所有菜肴。我认为这段代码应该用于此目的,但它并没有。我做错了什么?
当用户点击特定菜肴时,应显示该菜肴的配方和其他详细信息。如何在火力基地进行这种选择性检索?
package foodelicious.com.foodfinal;
public class MainActivity extends AppCompatActivity {
private FloatingActionButton fab;
ScaleAnimation shrinkAnim;
private RecyclerView mRecyclerView;
private StaggeredGridLayoutManager mLayoutManager;
private TextView tvNoRecipes;
private ImageView DPoster;
private TextView DMovieName,DIngredients,DRecipeTitle,DRecipe;
private RatingBar Drate;
//Getting reference to Firebase Database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference mDatabaseReference = database.getReference();
private static final String userId = "53";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing our Recyclerview
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
tvNoRecipes = (TextView) findViewById(R.id.tv_no_recipes);
DPoster=(ImageView) findViewById(R.id.Dposter);
DIngredients=(TextView) findViewById(R.id.Ding);
//scale animation to shrink floating actionbar
shrinkAnim = new ScaleAnimation(1.15f, 0f, 1.15f, 0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
if (mRecyclerView != null) {
//to enable optimization of recyclerview
mRecyclerView.setHasFixedSize(true);
}
//using staggered grid pattern in recyclerview
mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
//Say Hello to our new FirebaseUI android Element, i.e., FirebaseRecyclerAdapter
FirebaseRecyclerAdapter<Recipe,RecipeViewHolder> adapter = new FirebaseRecyclerAdapter<Recipe, RecipeViewHolder>(
Recipe.class,
R.layout.recipe_board_item,
RecipeViewHolder.class,
//referencing the node where we want the database to store the data from our Object
mDatabaseReference.child("users").child(userId).child("movies").getRef()
) {
@Override
protected void populateViewHolder(final RecipeViewHolder viewHolder, Recipe model, int position) {
if(tvNoRecipes.getVisibility()== View.VISIBLE){
tvNoRecipes.setVisibility(View.GONE);
}
viewHolder.tvRecipeName.setText(model.getRecipeName());
viewHolder.ratingBar.setRating(model.getRecipeRating());
Picasso.with(MainActivity.this).load(model.getRecipePoster()).into(viewHolder.ivRecipePoster);
viewHolder.ivRecipePoster.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setContentView(R.layout.recipe_details);
}
});
}
};
mRecyclerView.setAdapter(adapter);
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_container, new AddRecipeFragment())
.addToBackStack(null)
.commit();
//animation being used to make floating actionbar disappear
shrinkAnim.setDuration(400);
fab.setAnimation(shrinkAnim);
shrinkAnim.start();
shrinkAnim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//changing floating actionbar visibility to gone on animation end
fab.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
if (fab.getVisibility() == View.GONE)
fab.setVisibility(View.VISIBLE);
}
//ViewHolder for our Firebase UI
public static class RecipeViewHolder extends RecyclerView.ViewHolder{
TextView tvRecipeName;
RatingBar ratingBar;
ImageView ivRecipePoster;
public RecipeViewHolder(View v) {
super(v);
tvRecipeName = (TextView) v.findViewById(R.id.iv_dish_name);
ratingBar = (RatingBar) v.findViewById(R.id.rating_bar);
ivRecipePoster = (ImageView) v.findViewById(R.id.iv_dish_poster);
}
}
}
10-05 16:43:08.462 30349-30479 / foodelicious.com.foodfinal D / FA:连接到远程服务 10-05 16:43:08.463 30349-30479 / foodelicious.com.foodfinal V / FA:处理排队的服务任务:1 10-05 16:43:13.592 30349-30479 / foodelicious.com.foodfinal V / FA:不活动,断开与服务的连接 10-05 16:43:21.549 30349-30354 / foodelicious.com.foodfinal I / art:部分代码缓存集合,代码= 29KB,数据= 29KB 10-05 16:43:21.550 30349-30354 / foodelicious.com.foodfinal I / art:代码缓存收集后,代码= 29KB,数据= 29KB 10-05 16:43:21.550 30349-30354 / foodelicious.com.foodfinal I / art:将代码缓存容量增加到128KB 10-05 16:43:21.617 30349-30349 / foodelicious.com.foodfinal D / AndroidRuntime:关闭VM 10-05 16:43:21.625 30349-30349 / foodelicious.com.foodfinal E / AndroidRuntime:FATAL EXCEPTION:main 流程:foodelicious.com.foodfinal,PID:30349 com.google.firebase.database.DatabaseException:类foodelicious.com.foodfinal.models.Recipe缺少一个没有参数的构造函数 在com.google.android.gms.internal.zzbqi $ zza.zze(未知来源) 在com.google.android.gms.internal.zzbqi $ zza.zzaG(未知来源) 在com.google.android.gms.internal.zzbqi.zze(未知来源) 在com.google.android.gms.internal.zzbqi.zzb(未知来源) 在com.google.android.gms.internal.zzbqi.zza(未知来源) 在com.google.firebase.database.DataSnapshot.getValue(未知来源) 在com.firebase.ui.database.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:147) 在com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:136) 在com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:176) 在android.support.v7.widget.RecyclerView $ Adapter.onBindViewHolder(RecyclerView.java:6476) 在android.support.v7.widget.RecyclerView $ Adapter.bindViewHolder(RecyclerView.java:6509) 在android.support.v7.widget.RecyclerView $ Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5452) 在android.support.v7.widget.RecyclerView $ Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5718) 在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:5557) 在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:5553) 在android.support.v7.widget.LayoutState.next(LayoutState.java:100) 在android.support.v7.widget.StaggeredGridLayoutManager.fill(StaggeredGridLayoutManager.java:1570) 在android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:682) 在android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:604) 在android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693) 在android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410) 在android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1710) 在android.support.v7.widget.RecyclerView $ 1.run(RecyclerView.java:346) 在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:871) 在android.view.Choreographer.doCallbacks(Choreographer.java:683) 在android.view.Choreographer.doFrame(Choreographer.java:616) 在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:857) 在android.os.Handler.handleCallback(Handler.java:751) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:154) 在android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
答案 0 :(得分:0)
错误:强>
com.google.firebase.database.DatabaseException:class foodelicious.com.foodfinal.models.Recipe缺少一个没有参数的构造函数
<强>解决方案强>:
将默认(无参数)构造函数添加到类Recipe
public class Recipe ... {
public Recipe() {
//
}
}