Using Firebase ListAdapter, I need to retrieve data from Multiple nodes and retrieve specific variable with condition
Example:
+-------------+--------------+
| node A | node B |
+-------------+--------------+
| name: jon | name: leen |
| age : 33 | age: 33 |
| city: amman | city: jeddah |
+-------------+--------------+
I need to retrieve data select name from npdeA, nodeB where name = "leen"
. How can I do that?
This is my code
enter code here // Real Code Start Here
ListView listView = (ListView) View.findViewById(R.id.MyList);
final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl("https://assss-bf843.firebaseio.com/users");
final FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(getActivity(),String.class,android.R.layout.simple_list_item_2,databaseReference) {
protected void populateView(View v, String model, int position) {
TextView textView = (TextView) v.findViewById(android.R.id.text1);
textView.setText(model);
}
}; //////////getActivity(), ApContent.class, R.layout.layout_action_plan, ref
listView.setAdapter(firebaseListAdapter);
You first make a custom class like:
class UserDetails {
private String name, city;
private int age;
public userDetails() {
}
public userDetails(String name, String city, int age) {
this.name = name;
this.city = city;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Q) Why you need to create a custom class?
A) Because you have to fetch multiple records of different types.
Now inside FirebaseListAdapter constructor pass the second argument as UserDetails.class (your custom class).
Now Firebase will fetch the complete details as mentions in your custom class (UserDetails).
Now in your populateView method, you can just check if the name has value equals to "leen" or not. If yes then you can set it into your textview.
So update your populateView like this:
protected void populateView(View v, UserDetails model, int position) {
if (model.getName().equals("leen")) {
TextView textView = (TextView) v.findViewById(android.R.id.text1);
textView.setText(model);
}
}
Now you will achieve what you want.
BTW, a better way of doing this is creating your custom ViewHolder class.
UPDATE
I think you are not writing the correct place holder inside angular brackets after FirebaseRecyclerAdapter
class name. So just copy my code and that will work:
FirebaseRecyclerAdapter<UserDetails, View> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<UserDetails, View>(UserDetails.class, android.R.layout.simple_list_item_2, View.class, databaseReference) {
@Override
protected void populateViewHolder(View v, UserDetails model, int position) {
if (model.getName().equals("leen")) {
TextView textView = (TextView) v.findViewById(android.R.id.text1);
textView.setText(model);
}
}
};
listView.setAdapter(firebaseRecyclerAdapter);