【问题标题】:Firebase Android accessing childFirebase Android 访问孩子
【发布时间】:2018-02-25 23:39:05
【问题描述】:

我今天请求您的帮助,因为我的应用程序使用 FirebaseDatabase 和 FireBaseAdapter 时出现问题。

数据库的结构如下所示:

`{
  "First_Main_Node" : {
    "Child_Node1" : {
      "description" : "Blabla",
      "image" : "Image1.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node2" : {
      "description" : "Blabla",
      "image" : "Image2.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node3" : {
      "description" : "Blabla",
      "image" : "Image3.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node4" : {
      "description" : "Blabla",
      "image" : "Image4.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node5" : {
      "description" : "Blabla",
      "image" : "Image5.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node6" : {
      "description" : "Blabla",
      "image" : "Image6.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node7" : {
      "description" : "Blabla",
      "image" : "Image7.jpg",
      "title" : "My Awesome Title"
    },
    "Child_Node8" : {
      "description" : "Blabla",
      "image" : "Image8.jpg",
      "title" : "My Awesome Title"
    }
  },
  "Second_Main_Node" : {
    "Child_Node1" : {
       "Element" : {
          "image" : "Image1.jpg",
          "price" : "100",
          "title" : "My Awesome Title"
    }
  }
    }`

我的应用程序的主要活动是我使用 FirebaseAdapter 填充的带有 Cardviews 的 RecyclerView,它通过使用以下代码行获取 First_Main_Node 的子级来填充 viewHolder:

    myRef = FirebaseDatabase.getInstance().getReference().child("/First_Main_Node");

问题是,正如您在 DB 结构中看到的那样,有一个 Second_Main_Node,它有 Nested Child_Node,它有 Nested Element 本身,最终有 title,price,image child。

我的问题来了,我想访问 Second_Main_Node > Child_Node1 并填充另一个 RecyclerView 但这次使用 Child_Node1 中的所有“元素”子级

我尝试了上面的代码行,通过 /Second_Main_Node/Child_Node1 更改子方法路径参数,但是 RecyclerView 显示带有“Null”作为标题的 Cardview并且没有其他反应,或者我的应用程序在打开第二个 RecyclerView 后立即崩溃,我试图更改 Reference, Child,都没有成功,我不明白我如何访问这些元素并填充第二个 RecyclerView ,我不认为这很难,但我已经差不多一个星期来解决这个问题了。

这是与 MainActivity RecyclerView 相关的代码

recyclerView.setHasFixedSize(true);


    recyclerView.setLayoutManager(new GridLayoutManager(this, 2));


    myref = FirebaseDatabase.getInstance().getReference().child("/First_Main_Node");

    FirebaseRecyclerAdapter<Watch, MainActivity.WatchViewHolder> recyclerAdapter = new FirebaseRecyclerAdapter<Watch, MainActivity.WatchViewHolder>(

            Watch.class,
            R.layout.individual_row,
            MainActivity.WatchViewHolder.class,
            myref
    ) {
        @Override
        protected void populateViewHolder(final MainActivity.WatchViewHolder viewHolder, final Watch model, int position) {

            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(MainActivity.this, WatchDisplayActivity.class);
                    startActivity(i);

                }
            });


            viewHolder.setTitle(model.getTitle());
            viewHolder.setDescription(model.getDescription());
            viewHolder.setImage(model.getImage());


        }
    };
    recyclerView.setAdapter(recyclerAdapter);


}

public static class WatchViewHolder extends RecyclerView.ViewHolder {

    View mView;
    TextView textView_title;
    TextView textView_description;
    ImageView imageView;


    public WatchViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        textView_title = itemView.findViewById(R.id.tv_titre);
        textView_description = itemView.findViewById(R.id.tv_desc);
        imageView = itemView.findViewById(R.id.iv_image);



    }



    public void setTitle(String title) {
        textView_title.setText(title + "");
    }


    public void setDescription(String description) {


        textView_description.setText(description);
    }

    public void setImage(String image) {
        Picasso.with(mView.getContext())
                .load(image)
                .into(imageView);
    }

}

}

与第二个 RecylerView 相关的那个

 rv_display.setHasFixedSize(true);
    rv_display.setLayoutManager(new GridLayoutManager(this,2));


    myref = FirebaseDatabase.getInstance().getReference().child("/Second_Main_Node/Child_Node1");



    FirebaseRecyclerAdapter<Watch, WatchDisplayActivity.WatchViewHolder> recyclerAdapter = new FirebaseRecyclerAdapter<Watch, WatchViewHolder>(

            Watch.class,
            R.layout.individual_row_display,
            WatchDisplayActivity.WatchViewHolder.class,
            myref
    ) {
        @Override
        protected void populateViewHolder(WatchViewHolder viewHolder, Watch model, int position) {

            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getApplicationContext(),"Test",Toast.LENGTH_SHORT).show();
                }
            });

            viewHolder.setTextView_price(model.getPrice());
            viewHolder.setImageView(model.getImage());
            viewHolder.setTextView_title(model.getTitle());
        }
    };rv_display.setAdapter(recyclerAdapter);


}


public static class WatchViewHolder extends RecyclerView.ViewHolder{

    View mView;
    TextView textView_title;
    TextView textView_price;
    ImageView imageView;


    public WatchViewHolder(View itemView){
        super(itemView);
        mView = itemView;
        textView_price = itemView.findViewById(R.id.tv_price_display);
        textView_title = itemView.findViewById(R.id.tv_titre_display);
        imageView = itemView.findViewById(R.id.iv_image_display);

    }




    public void setTextView_title(String title) {
        textView_title.setText(title + "");
    }

    public void setTextView_price(String price) {
        textView_price.setText(price);
    }

    public void setImageView(String image) {
        Picasso.with(mView.getContext())
                .load(image)
                .into(imageView);
    }
}

这就是 Logcat

02-26 16:57:41.103 19143-19143/package_name E/AndroidRuntime: FATAL EXCEPTION: main
                                                                 Process: fr.package_name, PID: 19143
                                                                 com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Double to String
                                                                     at com.google.android.gms.internal.zg.zzb(Unknown Source)
                                                                     at com.google.android.gms.internal.zg.zza(Unknown Source)
                                                                     at com.google.android.gms.internal.zg.zzb(Unknown Source)
                                                                     at com.google.android.gms.internal.zh.zze(Unknown Source)
                                                                     at com.google.android.gms.internal.zg.zzb(Unknown Source)
                                                                     at com.google.android.gms.internal.zg.zza(Unknown Source)
                                                                     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
                                                                     at com.firebase.ui.database.FirebaseRecyclerAdapter.parseSnapshot(FirebaseRecyclerAdapter.java:154)
                                                                     at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:143)
                                                                     at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:183)
                                                                     at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
                                                                     at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
                                                                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
                                                                     at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
                                                                     at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:556)
                                                                     at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
                                                                     at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
                                                                     at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
                                                                     at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
                                                                     at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
                                                                     at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1710)
                                                                     at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:346)
                                                                     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                     at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                     at android.view.Choreographer.doFrame(Choreographer.java:603)
                                                                     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                     at android.os.Handler.handleCallback(Handler.java:739)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                     at android.os.Looper.loop(Looper.java:234)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5526)
                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)

【问题讨论】:

  • 您在问题中包含了您的代码和 JSON 树的图片。请将其替换为实际代码和 JSON 作为文本。您可以通过单击your Firebase Database console 中的导出 JSON 链接轻松获得后者。将代码和 JSON 作为文本使其可搜索,使我们能够轻松地使用它来测试您的实际数据并在我们的答案中使用它,通常只是一件好事。
  • 另外:您共享的行对回收站视图没有任何作用。请务必分享minimal, complete code that reproduces the problem(阅读链接,它非常有用)。
  • 好的,请稍等,我现在就这样做
  • 我编辑了文本
  • 第二个适配器的路径/Second_Main_Node/Child_Node1 似乎很好。你开始听了吗?另外:考虑到第二个适配器侦听的路径是固定的,第一个适配器在这里真的相关吗?

标签: android firebase-realtime-database parent-child firebaseui


【解决方案1】:

问题解决了,确实价格子期望一个字符串,而我给出了一个 long/float 类型。 通过在价格值上添加双引号,例如 price: "99,9" 而不是 price: 99,9

它解决了问题,我现在可以访问子节点而不会崩溃或异常

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多