I want to get the value of cost and product name from the date child for all products. I am getting null value for above code.
How to get the value from different Childs?
My Java Class:
public class CompleteExpenses {
String product;
String date;
Long cost;
Long quantity;
public CompleteExpenses() {
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Long getCost() {
return cost;
}
public void setCost(Long cost) {
this.cost = cost;
}
public Long getQuantity() {
return quantity;
}
public void setQuantity(Long quantity) {
this.quantity = quantity;
}
}
My adapter:
public class Product_Adapter extends RecyclerView.Adapter {
List<CompleteExpenses> completeExpensesList;
public Product_Adapter(List<CompleteExpenses> completeExpensesList) {
this.completeExpensesList = completeExpensesList;
}
#NonNull
#Override
public RecyclerView.ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_layout,parent,false);
ViewHolderClass viewHolderClass=new ViewHolderClass(view);
return viewHolderClass;
}
#Override
public void onBindViewHolder(#NonNull RecyclerView.ViewHolder holder, int position) {
ViewHolderClass viewHolderClass = (ViewHolderClass) holder;
CompleteExpenses completeExpenses = completeExpensesList.get(position);
String strName = String.valueOf(completeExpenses.getProduct());
viewHolderClass.pr.setText(strName);
String strCost = String.valueOf(completeExpenses.getCost());
viewHolderClass.cs.setText(strCost);
}
#Override
public int getItemCount() {
return completeExpensesList.size();
}
public class ViewHolderClass extends RecyclerView.ViewHolder{
TextView pr,cs;
public ViewHolderClass(#NonNull View itemView) {
super(itemView);
pr = (TextView) itemView.findViewById(R.id.tv_productname);
cs = (TextView) itemView.findViewById(R.id.tv_costsum);
}
}
}
Java activity:
public class complete_expenses extends AppCompatActivity {
List<CompleteExpenses> completeExpenses;
RecyclerView recyclerView;
Product_Adapter product_adapter;
DatabaseReference databaseReference,databaseReference1;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_complete_expenses);
recyclerView=findViewById(R.id.rv_products);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(llm);
databaseReference= FirebaseDatabase.getInstance().getReference().child("Project 1").child("CompleteExpenses");
databaseReference.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
completeExpenses = new ArrayList<CompleteExpenses>();
CompleteExpenses e = snapshot.getValue(CompleteExpenses.class);
completeExpenses.add(e);
product_adapter=new Product_Adapter(completeExpenses);
recyclerView.setAdapter(product_adapter);
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
}
});
}
}
Firebase structure:
You're reading all data from Project 1/CompleteExpenses and are then trying to read a single object with properties cost, date, product and quantity from there.
If we look at your JSON however, the Project 1/CompleteExpenses doesn't have those properties. Instead those properties exist on a child node (and presumably other child nodes) two levels lower in your JSON.
So you'll either need to read data from the lower level in your JSON:
databaseReference= FirebaseDatabase.getInstance().getReference()
.child("Project 1/CompleteExpenses/M-Sand/11-2-2021");
databaseReference.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
completeExpenses = new ArrayList<CompleteExpenses>();
CompleteExpenses e = snapshot.getValue(CompleteExpenses.class);
Or you'll need to navigate over the data that you've read in the onDataChange:
databaseReference= FirebaseDatabase.getInstance().getReference().child("Project 1").child("CompleteExpenses");
databaseReference.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
completeExpenses = new ArrayList<CompleteExpenses>();
for (DataSnapshot nameSnapshot: snapshot.getChildren()) {
for (DataSnapshot dateSnapshot: nameSnapshot.getChildren()) {
CompleteExpenses e = dateSnapshot.getValue(CompleteExpenses.class);
completeExpenses.add(e);
}
}
product_adapter=new Product_Adapter(completeExpenses);
recyclerView.setAdapter(product_adapter);
}
Related
I get this error when I run the program:
com.cdirect.agenda2.AllEvents$1.onDataChange(AllEvents.java:47)
-Events events = dataSnapshot.getValue(Events.class);
I want to get all data from my FirebaseDatabase. I created Events.java. It has getter and setters. MyAdapter is adapting for RecyclerView on AllEvents.java. I want to show all data on AllEvents.java.
But I cannot success. Can you help me?
MyAdapter.java:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
Context context;
ArrayList<Events> list;
public MyAdapter(Context context, ArrayList<Events> list) {
this.context = context;
this.list = list;
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.evententry,parent,false);
return new MyViewHolder(v);
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder holder, int position) {
Events events = list.get(position);
holder.plan.setText(events.getPlan());
holder.note.setText(events.getNote());
holder.date.setText(events.getDate());
holder.time.setText(events.getTime());
holder.remb.setText(events.getRemb());
}
#Override
public int getItemCount() {
return list.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
TextView id, plan, note, date, time, remb;
public MyViewHolder(#NonNull View itemView) {
super(itemView);
id = itemView.findViewById(R.id.tvIdCard);
plan = itemView.findViewById(R.id.tvPlanCard);
note = itemView.findViewById(R.id.tvNoteCard);
date = itemView.findViewById(R.id.tvDateCard);
time = itemView.findViewById(R.id.tvTimeCard);
remb = itemView.findViewById(R.id.tvRememberCard);
}
}
MyEvents.java
public class AllEvents extends AppCompatActivity {
RecyclerView recyclerView;
ArrayList<Events> list;
DatabaseReference dbRef;
MyAdapter adapter;
#Override
public void onBackPressed() {
super.onBackPressed();
startActivity(new Intent(AllEvents.this, MainActivity.class));
finish();
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_events);
recyclerView = findViewById(R.id.recycleView);
dbRef = FirebaseDatabase.getInstance().getReference("Events");
list = new ArrayList<>();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyAdapter(this, list);
recyclerView.setAdapter(adapter);
dbRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot: snapshot.getChildren()){
Events events = dataSnapshot.getValue(Events.class);
list.add(events);
}
adapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
}
});
}
}
Events.java
public class Events {
String id;
String plan;
String note;
String date;
String time;
String remb;
public Events(String id, String plan, String note, String date, String time, String remb) {
this.id = id;
this.plan = plan;
this.note = note;
this.date = date;
this.time = time;
this.remb = remb;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPlan() {
return plan;
}
public void setPlan(String plan) {
this.plan = plan;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getRemb() {
return remb;
}
public void setRemb(String remb) {
this.remb = remb;
}
}
My Database is:
enter image description here
First try to make them private for the Event class.
private String id;
private String plan;
private String note;
private String date;
private String time;
private String remb;
Second, change adapter = new MyAdapter(this, list); line to here. Additional here, you need handle whenonCancelled also.
dbRef.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot: snapshot.getChildren()){
Events events = dataSnapshot.getValue(Events.class);
list.add(events);
}
adapter = new MyAdapter(this, list);
adapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
Log.i("???", "onCancelled Error: " + error.getMessage());
}
});
I have a recyclerview where I list expenses' category from Firebase using JAVA, I am looking to group categories so I only get 1 recyclerview item called FOOD, ENTERTAINMENT etc, this and the total amount for every item in that category.
this is my recyclerview result now;
this is my adapter class;
public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ViewHolder> {
private Context mContext;
private ArrayList<Expense> categories;
public CategoriesAdapter(Context mContext, ArrayList<Expense> categories) {
this.mContext = mContext;
this.categories = categories;
}
#NonNull
#Override
public ViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.categories_retrieve_layout, parent, false);
return new ViewHolder(view);
}
#SuppressLint("SetTextI18n")
#Override
public void onBindViewHolder(#NonNull ViewHolder holder, int position) {
final Expense expense = categories.get(position);
holder.category.setText("" + expense.getCategory());
holder.amount.setText("$ " + formatNumberCurrency(String.valueOf(expense.getAmount())));
}
#Override
public int getItemCount() {
return categories.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView category;
private TextView amount;
private TextView percentage;
public ViewHolder(#NonNull View itemView) {
super(itemView);
category = itemView.findViewById(R.id.category_name);
amount = itemView.findViewById(R.id.category_total_amount);
percentage = itemView.findViewById(R.id.percentage_indicator);
}
}
private static String formatNumberCurrency(String amount) {
DecimalFormat formatter = new DecimalFormat("###,###,###");
return formatter.format(Double.parseDouble(amount));
}
}
and here is how I am reading my data
final Calendar c = Calendar.getInstance();
#SuppressLint("SimpleDateFormat") DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
String date = dateFormat.format(c.getTime());
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Expenses").child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid());
Query query = databaseReference.orderByChild("date").equalTo(date);
query.addValueEventListener(new ValueEventListener() {
#SuppressLint("NotifyDataSetChanged")
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
expenses.clear();
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Expense expense = dataSnapshot.getValue(Expense.class);
expenses.add(expense);
}
categoriesAdapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
}
});
Here, the output I am expecting to get
any advice on how to create the logic for this?
This is the error I got while trying to use Sambhav. K's answer:
You can check if a value already exists or not when adding it to the list. Try this:
query.addValueEventListener(new ValueEventListener() {
#SuppressLint("NotifyDataSetChanged")
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
expenses.clear();
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Expense expense = dataSnapshot.getValue(Expense.class);
boolean exists = false;
int count = 0;
for(int i = 0; i < expenses.size(); i++){
count = i;
exists = expenses.get(i).getCategory().equalsIgnoreCase(expense.getCategory());
if(exists) break;
}
if(exists){
expenses.get(count).setAmount(expenses.get(i).getAmount()() + expense.getAmount());
}else{
expenses.add(expense);
}
}
categoriesAdapter.notifyDataSetChanged();
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
error.printStackTrace();
}
});
I am creating an application and I need to use a nested FirebaseRecyclerAdapter. But I can't find examples on the Internet of how to do it correctly, maybe someone can show with an example how to do it correctly.
Here is my main adapter inside which I need to implement the second adapter:
FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<DataSnapshot>()
.setLifecycleOwner((LifecycleOwner)mContext)
.setQuery(FirebaseDatabase.getInstance().getReference("Posts").child(postId).child("Comments"), new SnapshotParser<DataSnapshot>() {
#NonNull
#Override
public DataSnapshot parseSnapshot(#NonNull DataSnapshot snapshot) {
return snapshot;
}
}).build();
adapter = new FirebaseRecyclerAdapter<DataSnapshot, CommentAdapter>(options)
{
#NonNull
#Override
public CommentAdapter onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comments, parent, false);
return new CommentAdapter(view);
}
#Override
protected void onBindViewHolder(#NonNull CommentAdapter holder, int position, #NonNull DataSnapshot model) {
String comment = model.child("comment").getValue(String.class);
Long dateLong = Long.parseLong(model.child("time").getValue(String.class));
commentID = model.child("commentId").getValue(String.class);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyy HH:mm");
Date date = new Date(dateLong);
Query query = postsReference.orderByKey().equalTo(postId);
query.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren())
{
String image = dataSnapshot.child("avatarUri").getValue(String.class);
String nickname = dataSnapshot.child("nickname").getValue(String.class);
Picasso.get().load(image).into(holder.avatar);
holder.nick.setText(nickname);
}
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
}
});
holder.comment.setText(comment);
holder.date.setText(simpleDateFormat.format(date));
holder.reply.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
writeComment.setText("#" + holder.nick.getText()+" ");
replyLayout.setVisibility(View.VISIBLE);
replyLayout.setBackgroundColor(Color.parseColor("#FF262726"));
replyTo.setText("Replying to " + holder.nick.getText());
}
});
replyLinearLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
holder.mRecyclerView.setLayoutManager(replyLinearLayoutManager);
holder.mRecyclerView.setHasFixedSize(true);
FirebaseRecyclerAdapter replyAdapter = setReplyAdapter();
holder.mRecyclerView.setAdapter(replyAdapter);
replyAdapter.startListening();
}
};
Reply class:
public class Reply {
private String userId;
private String comment;
private String date;
private String commentId;
public Reply()
{
}
public Reply(String userId, String comment, String date, String commentId)
{
this.comment = comment;
this.userId = userId;
this.date = date;
this.commentId = commentId;
}
public String getCommentId() {
return commentId;
}
public void setCommentId(String commentId) {
this.commentId = commentId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
ReplyRecyclerViewAdapter:
public class ReplyRecyclerViewAdapter extends RecyclerView.ViewHolder{
CircleImageView avatar;
TextView nick, comment, date, reply;
public ReplyRecyclerViewAdapter(#NonNull View view) {
super(view);
avatar = view.findViewById(R.id.commentator_avatar_reply);
nick = view.findViewById(R.id.commentator_nick_reply);
comment = view.findViewById(R.id.comment_text_reply);
date = view.findViewById(R.id.reply_date);
reply = view.findViewById(R.id.reply);
}
}
And this is the method in which I call the nested adapter initialization, but I have a problem that when I try to call a variable of this class from holder, the variable does not see them. I marked these fields with comments in the code.
private FirebaseRecyclerAdapter setReplyAdapter()
{
FirebaseRecyclerOptions optionsReply = new FirebaseRecyclerOptions.Builder<DataSnapshot>()
.setLifecycleOwner((LifecycleOwner)mContext)
.setQuery(FirebaseDatabase.getInstance().getReference("Posts").child(postId).child("Comments").child(commentID).child("Reply"), new SnapshotParser<DataSnapshot>() {
#NonNull
#Override
public DataSnapshot parseSnapshot(#NonNull DataSnapshot snapshot) {
return snapshot;
}
}).build();
FirebaseRecyclerAdapter replyAdapter = new FirebaseRecyclerAdapter<DataSnapshot, ReplyRecyclerViewAdapter>(optionsReply)
{
#NonNull
#Override
public ReplyRecyclerViewAdapter onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comments, parent, false);
return new ReplyRecyclerViewAdapter(view);
}
#Override
protected void onBindViewHolder(#NonNull ReplyRecyclerViewAdapter holder, int position, #NonNull DataSnapshot model) {
String comment = model.child("comment").getValue(String.class);
Long dateLong = Long.parseLong(model.child("time").getValue(String.class));
commentID = model.child("commentId").getValue(String.class);
replyReference = FirebaseDatabase.getInstance().getReference("Posts").child(postId).child("Comments").child(commentID).child("Reply");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyy HH:mm");
Date date = new Date(dateLong);
Query query = postsReference.orderByKey().equalTo(postId);
query.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot : snapshot.getChildren())
{
String image = dataSnapshot.child("avatarUri").getValue(String.class);
String nickname = dataSnapshot.child("nickname").getValue(String.class);
Picasso.get().load(image).into(holder.avatar); //holder.avatar it cannot find avatar variable
holder.nick.setText(nickname); //the same is here
}
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
}
});
holder.comment.setText(comment); //here
holder.date.setText(simpleDateFormat.format(date)); //here
}
};
return replyAdapter;
}
I have a app with chatrooms where I want to show the people in that chatroom.When someone joins the chatroom I set the value of their node to be true.Like this
Like you can see I also have the data of users underit.I want to use the list of members/documentid and use that list to get the data of only those people from the profiledata node.
My class
public class chatroommembers extends AppCompatActivity {
String documentid;
RecyclerView recyclerView;
DatabaseReference peopleref;
DatabaseReference membersref;
private List<User> list;
private MembersAdapter membersAdapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chatroommembers);
Intent data = getIntent();
documentid = data.getStringExtra("documentid");
peopleref = FirebaseDatabase.getInstance().getReference().child("Users").child("profiledata");
membersref = FirebaseDatabase.getInstance().getReference().child("Chatrooms").child("members").child(documentid);
recyclerView = findViewById(R.id.membersRecycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
list = new ArrayList<>();
membersref.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot snapshot) {
for (DataSnapshot snapshot1:snapshot.getChildren()){
String uid = snapshot1.getKey();
DatabaseReference peoplesref = peopleref.child(uid);
}
membersAdapter = new MembersAdapter(list);
recyclerView.setAdapter(membersAdapter);
}
#Override
public void onCancelled(#NonNull DatabaseError error) {
}
});
}
public static class User{
String fullname,imageUrl,Uid,Email,Buddies;
public String getFullname() {
return fullname;
}
public User(){
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getUid() {
return Uid;
}
public void setUid(String uid) {
Uid = uid;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getBuddies() {
return Buddies;
}
public void setBuddies(String buddies) {
Buddies = buddies;
}
public User(String fullname, String imageUrl, String uid, String email, String buddies) {
this.fullname = fullname;
this.imageUrl = imageUrl;
Uid = uid;
Email = email;
Buddies = buddies;
}
}
public class MembersAdapter extends RecyclerView.Adapter<MembersAdapter.MembersViewHolder>{
private List<User> list;
public MembersAdapter(List<User> list) {
this.list = list;
}
#NonNull
#Override
public MembersAdapter.MembersViewHolder onCreateViewHolder(#NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.users_recycler_layout,parent,false);
return new MembersAdapter.MembersViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull MembersAdapter.MembersViewHolder holder, int position) {
User ld = list.get(position);
holder.name.setText(ld.getFullname());
if (ld.getImageUrl().equals("noimage")){
Glide.with(getApplicationContext()).load(R.drawable.profile).into(holder.circleImageView);
}else{
Glide.with(getApplicationContext()).load(ld.getImageUrl()).into(holder.circleImageView);
}
}
#Override
public int getItemCount() {
return list.size();
}
public class MembersViewHolder extends RecyclerView.ViewHolder{
TextView name;
CircleImageView circleImageView;
public MembersViewHolder(#NonNull View itemView) {
super(itemView);
name = itemView.findViewById(R.id.usersname);
circleImageView = itemView.findViewById(R.id.usersimage);
}
}
}
}
What you're describing is a fairly standard operation known as a client-side join. In Android it'd look something like this:
String chatroomId = "-MBISFO12u2tok9CeWwi";
DatabaseReference membersRef = FirebaseDatabase.getInstance().getReference("Chatrooms/members").child(chatroomId);
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("Users/profiledata")
membersRef.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot memberSnapshot: dataSnapshot.getChildren()) {
String uid = memberSnapshot.getKey();
DatabaseReference userRef = usersRef.child(uid);
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
#Override
public void onDataChange(DataSnapshot userSnapshot) {
Log.i("USER", userSnapshot.child("Full name").getValue(String.class));
}
#Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
}
#Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
}
My RecyclerView not show any data from Firebase. I don't see any errors at logcat so I don't know why. I followed guide from youtube video. But still nothing. I'm using android 8.0 and API 27. Hope Somebody can help.
My Main Activity Code:
public class ViewProduct extends AppCompatActivity {
DatabaseReference ref;
ArrayList<Model> list;
private RecyclerView recyclerView;
private RecyclerView.Adapter viewHolder;
private RecyclerView.LayoutManager layoutManager;
SearchView searchView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_product) ;
ref = FirebaseDatabase.getInstance().getReference().child("buddymealplanneruser").
child("Products");
recyclerView = findViewById(R.id.stallproductRecyclerView);
//recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//SEARCH VIEW
searchView = findViewById(R.id.searchProductStall);
//ADAPTER
list = new ArrayList<>();
viewHolder = new ViewHolder(list);
recyclerView.setAdapter(viewHolder);
}
#Override
protected void onRestart() {
super.onRestart();
if (ref!=null)
{
ref.addValueEventListener(new ValueEventListener() {
#Override
public void onDataChange(#NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists())
{
//list = new ArrayList<>();
list.clear();
for(DataSnapshot ds : dataSnapshot.getChildren())
{
list.add(ds.getValue(Model.class));
}
//ViewHolder viewHolder = new ViewHolder(list);
//recyclerView.setAdapter(viewHolder);
viewHolder.notifyDataSetChanged();
}
}
#Override
public void onCancelled(#NonNull DatabaseError databaseError) {
Toast.makeText(ViewProduct.this, databaseError.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
}
if (searchView !=null)
{
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
#Override
public boolean onQueryTextSubmit(String s)
{
return false;
}
#Override
public boolean onQueryTextChange(String s) {
search(s);
return true;
}
});
}
}
private void search(String str) {
ArrayList<Model> myList = new ArrayList<>();
for(Model object : list)
{
if(object.getProductName().toLowerCase().contains(str.toLowerCase()))
{
myList.add(object);
}
}
ViewHolder viewHolder = new ViewHolder(myList);
recyclerView.setAdapter(viewHolder);
}
}
My Adapter:
public class ViewHolder extends RecyclerView.Adapter<ViewHolder.MyViewHolder> {
ArrayList<Model> list;
public ViewHolder (ArrayList<Model> list)
{
this.list=list;
}
#NonNull
#Override
public MyViewHolder onCreateViewHolder(#NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_product, viewGroup,false);
return new MyViewHolder(view);
}
#Override
public void onBindViewHolder(#NonNull MyViewHolder myViewHolder, int i) {
myViewHolder.productName.setText(list.get(i).getProductName());
myViewHolder.productCalorie.setText(list.get(i).getProductCalorie());
myViewHolder.StallId.setText(list.get(i).getStallId());
myViewHolder.productType.setText(list.get(i).getProductType());
myViewHolder.productServing.setText(list.get(i).getProductServing());
myViewHolder.statusProduct.setText(list.get(i).getStatusProduct());
}
#Override
public int getItemCount()
{
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder
{
TextView productName, productCalorie, StallId;
TextView productType, productServing, statusProduct;
ImageView productImageView;
public MyViewHolder (#NonNull View itemView){
super((itemView));
productName = itemView.findViewById(R.id.productTitle);
productCalorie = itemView.findViewById(R.id.productDescriptionCalorie);
StallId = itemView.findViewById(R.id.productDescriptionStallId);
productType = itemView.findViewById(R.id.productDescriptionType);
productServing=itemView.findViewById(R.id.productDescriptionServing);
statusProduct=itemView.findViewById(R.id.productDescriptionAvailibility);
//productImageView = itemView.findViewById(R.id.productImageView);
}
}
}
My Model :
package com.example.buddymealplannerstall.Child;
import android.view.Display;
public class Model {
//String productName, productImage, productCalorie, StallId, productType, productServing, statusProduct;
private String StallId;
private String productCalorie;
private String productImage;
private String productName;
private String productServing;
private String productType;
private String statusProduct;
public Model (String StallId,
String productCalorie,
String productImage,
String productName,
String productServing,
String productType,
String statusProduct){
this.StallId = StallId;
this.productCalorie = productCalorie;
this.productImage = productImage;
this.productName = productName;
this.productServing = productServing;
this.productType = productType;
this.statusProduct = statusProduct;
}
public Model(){
}
public String getStallId() {
return StallId;
}
public void setStallId(String stallId) {
StallId = stallId;
}
public String getProductCalorie() {
return productCalorie;
}
public void setProductCalorie(String productCalorie) {
this.productCalorie = productCalorie;
}
public String getProductImage() {
return productImage;
}
public void setProductImage(String productImage) {
this.productImage = productImage;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductServing() {
return productServing;
}
public void setProductServing(String productServing) {
this.productServing = productServing;
}
public String getProductType() {
return productType;
}
public void setProductType(String productType) {
this.productType = productType;
}
public String getStatusProduct() {
return statusProduct;
}
public void setStatusProduct(String statusProduct) {
this.statusProduct = statusProduct;
}
}
Screen Shot of my firebase and my apps.
firebase
my app
According to your comment:
yes, buddymealplanner is my project's name
Please note that there is no need to add the name of your project as a child in the reference. So please change the following line of code:
ref = FirebaseDatabase.getInstance().getReference().child("buddymealplanneruser").
child("Products");
Simply to:
ref = FirebaseDatabase.getInstance().getReference().child("Products");
I dont think you are populating your list, you are sending it empty. From what I can see, you only add items to the list when you are restarting the activity. Try either populating it before sendinig the list, or changing the onRestart() for an onStart() or an onResume().