Search code examples
androidfirebasefirebase-realtime-databasefirebaseui

How to retrieve specific variable in firebase with ListView?


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

Solution

  • 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);