Reputation: 13
I already have implemented this and it runs successfully. the problem is, I have more than 3 items under each unique key in Firebase. But it only displays the last item added to the firebase.
This is the code below. Thanks in advance :)
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);
}
}
}
and this is the firebase-database JSON format
"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"
}
}
},
Help me out. Thank you.
Upvotes: 1
Views: 1588
Reputation: 138979
You aren't getting anything in your RecyclerView
because you are passing a FirebaseRecyclerOptions
object to your adapter that contains a wrong query. You are missing a child, the user id. In order to solve this, please change the following line of code:
ex_childRef = rootRef.child("ExchangeItemsData");
to
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
ex_childRef = rootRef.child("ExchangeItemsData").child(uid);
And your problem will be solved.
Upvotes: 0
Reputation: 1396
You don't need to addListenerForSingleValueEvent again. FirebaseRecyclerAdapter already received each item as ImportExchangeItemModel and return in onBindViewHolder. Using it to display.
Upvotes: 0