簡體   English   中英

如何在我的 RecyclerView 中顯示來自 firebase 的子數據?

[英]How do I display child of child's data from firebase in my RecyclerView?

我想顯示數據庫中所有類別中所有子項的數據(添加了下面我的數據庫外觀的圖像)。 我正在使用需要傳遞 FirebaseRecyclerOptions object 的適配器將數據添加到我的 RecyclerView。 我看到一個答案,其中 DataSnapshot 用於獲取子數據的子數據,我嘗試使用它獲取數據,當我將其登錄到 logcat 時它顯示給我(注釋代碼是我嘗試使用的代碼),但我不知道如何與我的適配器 class 一起使用。

這是我的數據庫的樣子,我想要突出顯示的字段中的數據:

{
    "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 是我的 Model Class,SCardAdapter 是我的 Adapter Class。

這是我的片段(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();
    }
}

這是我的適配器 Class:

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);
        }
      ...
    }
}

首先,您需要創建 2 個循環,因為您的 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) {
    }
});

接下來您需要創建自己的適配器。 您也可以在 Google 上搜索以獲取更多信息。 但是你會明白這一點的。

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();
    }
}

暫無
暫無

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

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