[英]How do I fetch the total number of child nodes from my firebase realtime database in javascript?
[英]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.