【发布时间】:2017-10-05 09:43:02
【问题描述】:
我正在开发一个食谱书应用程序。 我的数据结构如下:
Reference
- users
-53
-movies
-id1
(-name
-rating
-ingredients(list)
-recipe
-photo)
-id2 (....)
数据已正确添加,但当我使用以下代码进行检索时,应用程序停止。我的模型类是Recipe。
我需要创建一个网格结构来显示所有菜肴。我认为这段代码应该达到这个目的,但事实并非如此。我做错了什么?
-
当用户点击特定菜肴时,应显示该菜肴的食谱和其他详细信息。如何在 Firebase 中进行这种选择性检索?
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); } } }
LOGCAT
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: 代码缓存收集后,code=29KB, data=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: 致命异常: 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) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
【问题讨论】:
-
与问题分享您的崩溃报告(logcat 错误)