我想显示数据库中所有类别中所有子级的数据(在下面添加了数据库外观的图像).我正在使用需要传递FirebaseRecyclerOptions对象的适配器向我的RecyclerView添加数据.我看到了一个答案,其中DataSnapshot被用来获取子对象数据,我试图使用它来获取数据,当我在logcat中登录它时,它显示了我的答案(注释代码就是我try 使用的代码),但我不知道如何在适配器类中使用它.

这就是我的数据库的外观,我想要突出显示的字段中的数据:

{
    "Category_wise": {
        "education": {
            "udemy": {     <-Return data of this child
                "companyName": "Udemy",
                ...
            },
            "khanacademy": {     <-Return data of this child
                "companyName": "Khan Academy",
                ...
            }
        },
        "technology": {
            "google": {    <-Return data of this child
                "companyName": "Google",
                ...
            },
            "facebook": {    <-Return data of this child
                "companyName": "Facebook",
                ...
            },
        ....
    }   
}

在下面的代码中,SCard是我的模型类,scardapter是我的适配器类.

这是我的片段(HomeFragment),我将数据添加到recyclerview中:

public class HomeFragment extends Fragment{
    private RecyclerView recyclerView;
    private Query query;
    private SCardAdapter<SCard, SCardAdapter.ViewHolder> adapter;

    public HomeFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home, container, false);
        recyclerView = v.findViewById(R.id.search_recyclerview);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);

        setQueryByOrder("technology", "totalInvestors");
        fetchResult(query);

        return v;
    }

//    protected void fetchAll(){
//        final DatabaseReference reference= FirebaseDatabase.getInstance().getReference("Category_wise");
//        reference.addValueEventListener(new ValueEventListener() {
//            @Override
//            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//                for (DataSnapshot snapshot : dataSnapshot.getChildren()){
//                    Log.i(TAG, "4321: Name of each company: " + Objects.requireNonNull(snapshot.child("companyName").getValue()).toString()
//                }
//            }
//            @Override
//            public void onCancelled(@NonNull DatabaseError databaseError) {}
//        });
//    }

    protected void setQueryByOrder(String choice, String order){
        query = FirebaseDatabase.getInstance()
                .getReference()
                .child("Category_wise").child(choice).orderByChild(order);
    }

    protected void fetchResult(Query query) {
        FirebaseRecyclerOptions<SCard> options =
                new FirebaseRecyclerOptions.Builder<SCard>()
                        .setQuery(query, new SnapshotParser<SCard>() {
                            @NonNull
                            @Override
                            public SCard parseSnapshot(@NonNull DataSnapshot snapshot) {
                                return new SCard(
                                        Objects.requireNonNull(snapshot.child("companyName").getValue()).toString()...);
                            }
                        })
                        .build();
        adapter = new SCardAdapter<>(options);
        adapter.startListening();
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

这是我的适配器类:

public class SCardAdapter<M extends SCard, V extends SCardAdapter.ViewHolder> extends FirebaseRecyclerAdapter<SCard, V> {

    FirebaseRecyclerOptions<SCard> options;
    public SCardAdapter(@Nullable FirebaseRecyclerOptions<SCard> options) {
        super(options);
        this.options = options;
    }

    @Override
    protected void onBindViewHolder(V holder, @SuppressLint("RecyclerView") final int position, SCard model) {
        holder.setName(model.getsName());
      ...
    }

    @Override
    public V onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.startup_search_card, parent, false);
        return (V) new ViewHolder(view);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView simg2;
        TextView sname, sdesc, senddate, sperraised, snoin, sminam;
        ProgressBar sraisingprogbar;
        public ViewHolder(View itemView) {
            super(itemView);
            sname = itemView.findViewById(R.id.sname);
          ...
        }

        public void setName(String string) {
            sname.setText(string);
        }
      ...
    }
}

推荐答案

首先,你需要创建两个循环,因为你的json看起来就是这样,并将它们存储在一个arrayList字节的内存中.您应该在arrayList中获取所有数据.

FirebaseDatabase.getInstance().getReference().child("Category_wise").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            ArrayList<Scard> sCardList = new ArrayList<Scard>();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                if (snapshot.exists()){
                    for (DataSnapshot shot : snapshot.getChildren()){
                        if (shot.exists()){
                            final Scard scard = shot.getValue(Scard.class);
                            if (scard != null){
                                sCardList.add(scard);
                            }
                        }
                    }
                }
            }
            final ScardAdapter scardAdapter = new ScardAdapter(sCardList);
            recyclerView.setAdapter(scardAdapter);
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

接下来,您需要创建自己的适配器.你也可以在谷歌上搜索更多信息.但你会明白这一点.

public class ScardAdapter extends RecyclerView.Adapter<ScardViewHolder> {
    private ArrayList<Scard> sCardList;
    public ScardAdapter(final ArrayList<Scard> sCardList) {
        this.sCardList = sCardList;
    }
    @NonNull
    @Override
    public ScardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.scard_item, parent, false);
        return new ScardViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull final ScardViewHolder holder, final int position) {
        final Scard model = sCardList.get(position);
        holder.getTvCompanyName.setText(model.getCompanyName);
    }
    @Override
    public int getItemCount() {
        return sCardList.size();
    }
}

Java相关问答推荐

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

这是什么Java构造`(InputStream Is)->;()->;{}`

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

迁移到Java 17后,日期显示不准确

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

如何将Pane的图像快照保存为BMP?

在处理2个映射表时,没有更多的数据可从套接字读取

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

对角线填充二维数组

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

H2数据库仅支持%1个结果集?

控制器建议异常处理

在数组中查找素数时出现逻辑错误

如何在Java上为循环数组从synchronized迁移到ReentrantLock

将在 Docker 中运行的 Spring Boot 连接到在 Docker 中运行的 PostgreSQL,无需 compose 文件?

元音变音字符:如何在 Java 中将Á<0x9c>转换为Ü?

如何在Java中调用对象上预定义的接口方法列表?

jpackage 之后如何使图像、属性和其他资源可供我的模块化应用程序使用?

从 Java 中的列表中删除最后一个元素