【问题标题】:How to display data in RecyclerView with CardView from Android firebase-realtime-database?如何使用来自 Android firebase-realtime-database 的 CardView 在 RecyclerView 中显示数据?
【发布时间】:2018-11-04 12:40:45
【问题描述】:

我已经实现了这个并且它运行成功。问题是,我在 Firebase 的每个唯一键下都有超过 3 个项目。但它只显示添加到 firebase 的最后一项。

这是下面的代码。在此先感谢:)

mAuth = FirebaseAuth.getInstance();
currentUserId = mAuth.getCurrentUser().getUid();
database = FirebaseDatabase.getInstance();
rootRef = database.getReference("rootDataRef");
ex_childRef = rootRef.child("ExchangeItemsData");
exrecyclerView = view.findViewById(R.id.exchangeRecyclerVeiwId);

GridLayoutManager glm = new GridLayoutManager(getContext(), 2);
    exrecyclerView.setLayoutManager(glm);
    fab = view.findViewById(R.id.load_exchange_fab_addId);
    fabMenu = view.findViewById(R.id.load_exchange_menuId);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AddExchangeItemFragment exFrag = new AddExchangeItemFragment();
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction()
                    .replace(R.id.exchange_fragment_holderId, exFrag, "exc");
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
            fabMenu.setVisibility(View.GONE);
        }
    });
    return view;
}

@Override
public void onStart() {
    super.onStart();
    FirebaseRecyclerOptions<ImportExchangeItemModel> exoptions =
            new FirebaseRecyclerOptions.Builder<ImportExchangeItemModel>()
                    .setQuery(ex_childRef, ImportExchangeItemModel.class)
                    .build();
    FirebaseRecyclerAdapter<ImportExchangeItemModel, ExchangeItemViewHolder> exadapter
            = new FirebaseRecyclerAdapter<ImportExchangeItemModel, ExchangeItemViewHolder>(exoptions) {
        @NonNull
        @Override
        public ExchangeItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.exchange_single_row,parent,false);
            ExchangeItemViewHolder holder=new ExchangeItemViewHolder(v);
            return holder;
        }

        @Override
        protected void onBindViewHolder(@NonNull final ExchangeItemViewHolder holder, final int position, @NonNull ImportExchangeItemModel model) {

            final String userIds = getRef(position).getKey();
             ex_childRef.addListenerForSingleValueEvent(new ValueEventListener() {
                 @Override
                 public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                     for (DataSnapshot dSnapshot:dataSnapshot.getChildren()){
                         for (DataSnapshot ds:dSnapshot.getChildren()){
                             final String exitemName=ds.child("exchangeProductName").getValue().toString();
                             final String exitemDesc =ds.child("productDesc").getValue().toString();
                             final String exitemImg =ds.child("imageUrl").getValue().toString();
                             holder.exItemName.setText(exitemName);
                             holder.exItemDesciption.setText(exitemDesc);
                             Picasso.get().load(exitemImg).into(holder.exItemImage);
                             holder.itemView.setOnClickListener(new View.OnClickListener() {
                                 @Override
                                 public void onClick(View v) {
                                     ExchangeItemsFragment fragment=new ExchangeItemsFragment();
                                     Bundle argss=new Bundle();
                                     argss.putString("exdataRoot",userIds);
                                     fragment.setArguments(argss);
                                     FragmentManager fragmentManager=getActivity().getSupportFragmentManager();
                                     FragmentTransaction transaction=fragmentManager.beginTransaction();
                                     transaction.replace(R.id.exchange_fragment_holderId,fragment,"exdetails");
                                     transaction.addToBackStack(null);
                                     transaction.commit();
                                 }
                             });
                         }
                     }
                 }

                 @Override
                 public void onCancelled(@NonNull DatabaseError databaseError) {

                 }
             });
        }
    };




    exrecyclerView.setAdapter(exadapter);
    exadapter.startListening();
}
public static class ExchangeItemViewHolder extends RecyclerView.ViewHolder{
    TextView exItemName,exItemDesciption;
    ImageView exItemImage;

    public ExchangeItemViewHolder(View itemView) {
        super(itemView);
        exItemName=itemView.findViewById(R.id.exchangeitemNameIdTV);
        exItemDesciption=itemView.findViewById(R.id.exchangeitemDescriptionCardViewId);
        exItemImage=itemView.findViewById(R.id.exchangeItemImageCardId);
    }
}

}

这是 firebase-database JSON 格式

"ExchangeItemsData" : {
  "lhmuj6n3g6Su1rv7XJLq5tV62yr2" : {
    "-LQQ7scByWcswW2VIPM5" : {
      "exchangeProductName" : "fsfsdfs",
      "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/binimoy-97025.appspot.com/o/ExchangeImages%2F2c2a91c8-0f3e-46ee-afd2-41141ee3c42b?alt=media&token=e8599f5c-b91c-415a-8e79-fcac737a4f9f",
      "phoneNo" : 5465464,
      "productDesc" : "fsdf",
      "productName" : "sdfsfds",
      "userID" : "lhmuj6n3g6Su1rv7XJLq5tV62yr2"
    },
    "-LQSjH-LB4ud-i6M2ZMa" : {
      "exchangeProductName" : "jgjhgjhg",
      "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/binimoy-97025.appspot.com/o/ExchangeImages%2F4da464a7-142b-4bf1-b92c-9852fc38878a?alt=media&token=105d17e7-87c4-45a2-92a6-7f74afaca145",
      "phoneNo" : 524343,
      "productDesc" : "gdfytfhg",
      "productName" : "hgfhfhg",
      "userID" : "lhmuj6n3g6Su1rv7XJLq5tV62yr2"
    },
    "-LQTBpwWcA2OycVgCyIR" : {
      "exchangeProductName" : "dasdsad",
      "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/binimoy-97025.appspot.com/o/ExchangeImages%2F82118232-89d8-47d0-8e60-57481eba67bd?alt=media&token=bf372222-dc97-43bf-9e86-058174bc2c71",
      "phoneNo" : 654654,
      "productDesc" : "asdasd",
      "productName" : "aasdasd",
      "userID" : "lhmuj6n3g6Su1rv7XJLq5tV62yr2"
    },
    "-LQTMxhmgbvRHzyPqRK2" : {
      "exchangeProductName" : "fsdfs",
      "imageUrl" : "https://firebasestorage.googleapis.com/v0/b/binimoy-97025.appspot.com/o/ExchangeImages%2F96769920-279b-47a2-a6fc-adb23ebae5fa?alt=media&token=609e396a-dcd6-493e-ae64-5871318d5f6f",
      "phoneNo" : 546546,
      "productDesc" : "sfdsdf",
      "productName" : "fsdfsf",
      "userID" : "lhmuj6n3g6Su1rv7XJLq5tV62yr2"
    }
  }
},

firebasedatabase image

帮帮我。谢谢。

【问题讨论】:

  • 能否请您添加一个格式化的数据库结构或者更好的 JSON 导出?或者至少是一个屏幕截图。
  • 遗憾的是我没有在这里张贴图片的功能..我试过..
  • 从您的 Firebase 控制台创建 JSON 导出。
  • 我检查了数据快照,里面有我需要的所有值。但是 th recyclerView 只显示最后输入的数据.. @AlexMamo
  • 如果你不添加你的架构,我帮不上什么忙。

标签: java android firebase firebase-realtime-database


【解决方案1】:

此代码正在使用 firebase 数据库。 试试这个代码希望它对你有帮助。 https://github.com/chetanmahajan850/RecycleviewDemo/tree/master/TestApp

【讨论】:

    【解决方案2】:

    您的RecyclerView 中没有任何内容,因为您将FirebaseRecyclerOptions 对象传递给包含错误查询的适配器。您缺少一个孩子,即用户 ID。为了解决这个问题,请更改以下代码行:

    ex_childRef = rootRef.child("ExchangeItemsData");
    

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    ex_childRef = rootRef.child("ExchangeItemsData").child(uid);
    

    你的问题就解决了。

    【讨论】:

    • 谢谢兄弟..你救了我..爱
    【解决方案3】:

    您不需要再次添加ListenerForSingleValueEvent。 FirebaseRecyclerAdapter 已将每个项目作为 ImportExchangeItemModel 接收并在 onBindViewHolder 中返回。用它来显示。

    【讨论】:

    • 我按照你说的试过了,但是没有用。我已经将数据从 firebase 加载到数据快照中,但 recyclerView 只显示最后输入的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多