簡體   English   中英

當我嘗試將數據從Firebase數據庫添加到firebaseViewHolder時,Android App不斷停止

[英]Android App keeps stopping when i try to add data from firebase database to a firebaseViewHolder

我正在開發食譜書應用程序。 我的數據結構如下:

 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, ie, 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:代碼緩存收集后,代碼= 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:43:21.625 30349-30349 / foodelicious.com.foodfinal E / AndroidRuntime:致命例外:主進程:foodelicious.com.foodfinal,PID:30349 com.google.firebase.database.DatabaseException:類foodelicious.com.foodfinal .models.Recipe缺少構造函數 在com.google.android.gms.internal.zzbqi $ zza.zzaG(未知來源)com.google.android.gms.internal.zzbqi $ zza.zze(未知來源)處沒有參數。 com上com.google.android.gms.internal.zzbqi.zzb(未知源)的com.google.android.gms.internal.zzbqi.zza(未知源)的gms.internal.zzbqi.zze(未知源)。 com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:136)上com.firebase.ui.database.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:147)上的google.firebase.database.DataSnapshot.getValue(未知源) )在com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:176)在android.support.v7.widget.RecyclerView $ Adapter.onBindViewHolder(RecyclerView.java:6476)在android.support.v7.widget處。 android.support.v7.widget.RecyclerView $ Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5452)上的RecyclerView $ Adapter.bindViewHolder(RecyclerView.java:6509) android.support.v7.widget.Recycler.v7.widget.RecyclerView $ Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5718)位於android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:5557) android.support.v7.widget.LayoutState.next(LayoutState.java:100)處的.getViewForPosition(RecyclerView.java:5553)android.support.v7.widget.StaggeredGridLayoutManager.fill(StaggeredGridLayoutManager.java:1570)在android.support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:604)上的support.v7.widget.StaggeredGridLayoutManager.onLayoutChildren(StaggeredGridLayoutManager.java:682)在android.support.v7.widget.RecyclerView.dispatchLayoutLayout2(RecyclerView。 android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)上的java:3693)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.os.Handler.dispatchMessage(Handler.java:95)上的android.os.Handler.handleCallback(Handler.java:751)上的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:857) .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)

錯誤:

com.google.firebase.database.DatabaseException:類foodelicious.com.foodfinal.models.Recipe缺少一個沒有參數的構造函數

解決方案 :將默認(無參數)構造函數添加到類Recipe

public class Recipe ... {

   public Recipe() {
       //
   }


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM