【问题标题】:Android App keeps stopping when i try to add data from firebase database to a firebaseViewHolder当我尝试将数据从 firebase 数据库添加到 firebaseViewHolder 时,Android 应用程序不断停止
【发布时间】:2017-10-05 09:43:02
【问题描述】:

我正在开发一个食谱书应用程序。 我的数据结构如下:

 Reference
   - users
     -53
     -movies
       -id1
          (-name
          -rating
          -ingredients(list)
          -recipe
          -photo)
       -id2 (....)

数据已正确添加,但当我使用以下代码进行检索时,应用程序停止。我的模型类是Recipe

  1. 我需要创建一个网格结构来显示所有菜肴。我认为这段代码应该达到这个目的,但事实并非如此。我做错了什么?

  2. 当用户点击特定菜肴时,应显示该菜肴的食谱和其他详细信息。如何在 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 错误)

标签: java android firebase


【解决方案1】:

错误:

com.google.firebase.database.DatabaseException:类 foodelicious.com.foodfinal.models.Recipe 在

处缺少没有参数的构造函数

解决方案: 将默认(无参数)构造函数添加到您的类Recipe

public class Recipe ... {

   public Recipe() {
       //
   }


}

【讨论】:

  • YES ..GOT 食谱列表...我怎样才能在 Firebase 中实现选择性检索?即,如果用户单击列表元素,则需要显示与该元素相关的所有详细信息。
猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多