Nick Pampoukidis
Nick Pampoukidis

Reputation: 742

Make FirebaseRecyclerAdapter get data under conditions and not all of them

I need to adjust somehow the FirebaseRecyclerAdapter in order to get some data from my database and not all of them. Is there any way to achieve that? My end goal is to show 10 random entries on the screen! Here is what I tried and the results:

FirebaseRecyclerAdapter<Houses, HousesViewHolder> mHousesRecyclerAdapter = new FirebaseRecyclerAdapter<Houses, HousesViewHolder>(
                Houses.class,
                R.layout.house_single,
                HousesViewHolder.class,
                mDatabaseHouses
        ) {
            @Override
            protected void populateViewHolder(HousesViewHolder viewHolder, Houses house, int position) {
                if (Integer.parseInt(house.getPrice()) > 200) {
                    viewHolder.setHouseName(house.getHouse_name());
                    viewHolder.setCity(house.getCity());
                    viewHolder.setImage(house.getMainFoto(), getApplicationContext());
                    viewHolder.setPrice(house.getPrice());
                }

            }
        };

        mRecyclerView.setAdapter(mHousesRecyclerAdapter);

enter image description here

The entries with the google logo are the houses that have price < 200 and are the houses in this example that I do not them to be appeared at all.

Single House XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/single_house_image"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/common_google_signin_btn_icon_dark_normal" />

    <TextView
        android:id="@+id/single_house_name_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="24dp"
        android:text="House Name"
        android:textColor="@android:color/black"
        android:textSize="18sp"
        app:layout_constraintLeft_toRightOf="@+id/single_house_image"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/single_house_location_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:text="House Location "
        android:textSize="14sp"
        app:layout_constraintLeft_toRightOf="@+id/single_house_image"
        app:layout_constraintTop_toBottomOf="@+id/single_house_name_tv" />

    <TextView
        android:id="@+id/single_house_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="6dp"
        android:text="Price"
        android:textSize="14sp"
        app:layout_constraintLeft_toRightOf="@+id/single_house_image"
        app:layout_constraintTop_toBottomOf="@+id/single_house_location_tv" />
</android.support.constraint.ConstraintLayout>

Upvotes: 1

Views: 2072

Answers (4)

gtzinos
gtzinos

Reputation: 1197

You can use a ListView instead of this firebaserecycler. Check an example:

List<YourObject> mylist = new ArrayList<YourObject>();

database.child("houses").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                 //Filter your data
                 String name = postSnapshot.child("name").getValue().toString();
                 if(name.equals("test") {
                     YourObject myObject = new YourObject(name);
                     mylist.add(myObject);
                 }
             }

             updatelist();
        }

        @Override
        public void onCancelled(DatabaseError databaseError2) {

        }
 });

Update your listview

 void updatelist() {
     ListView yourListView = (ListView) findViewById(R.id.myListView);

     // get data from the table by the HousesAdapter
     YourAdapter customAdapter = new YourAdapter(YourClass.this, R.layout.adapter_layout, mylist);

     yourListView.setAdapter(customAdapter);
 }

An adapter example:

public class YourAdapter extends ArrayAdapter<YourObject> {
    Context context;

    public YourAdapter(Context context, int resource, List<Houses> items) {
        super(context, resource, items);
        this.context = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;

        YourObject yourObject = getItem(position);

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v = vi.inflate(R.layout.adapter_layout, null);
        }

        TextView mytextview = (TextView) v.findViewById(R.id.mytextview);
        mytextview.setText(yourObject.getName());

        return v;
    }
}

YourObject class

public class YourObject {
    private String name;

    public YourObject(String name) {
         this.name = name;
    }

    public String getName() {
        return this.name;
    }

 }

Layout

 <ListView
        android:id="@+id/myListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">
 </ListView>

Upvotes: 3

Atif Farrukh
Atif Farrukh

Reputation: 2261

User Firebase Query to limit your results

Query query = database.child(FirebasePaths.HOUSES).orderByChild(PRICE).startAt(200);

This will query your database for houses whose prices are above 200.

Upvotes: 0

Sergey Emeliyanov
Sergey Emeliyanov

Reputation: 6961

In such situations I just make set the child Views visibility inside the ViewHolder to GONE, so they disappear if they do not match the case:

FirebaseRecyclerAdapter<Houses, HousesViewHolder> mHousesRecyclerAdapter = new FirebaseRecyclerAdapter<Houses, HousesViewHolder>(
                Houses.class,
                R.layout.house_single,
                HousesViewHolder.class,
                mDatabaseHouses
        ) {
            @Override
            protected void populateViewHolder(HousesViewHolder viewHolder, Houses house, int position) {
                if (Integer.parseInt(house.getPrice()) > 200) {
                    viewHolder.setHouseName(house.getHouse_name());
                    viewHolder.setCity(house.getCity());
                    viewHolder.setImage(house.getMainFoto(), getApplicationContext());
                    viewHolder.setPrice(house.getPrice());
                } else {
                    viewHolder.childView.setVisibility(View.GONE);
                    // repeat this for each childView inside your ViewHolder
                    ...
                }
            }
        };

        mRecyclerView.setAdapter(mHousesRecyclerAdapter);

This will work, but make sure that your item_view.xml which contains all the views from ViewHolder has appropriate setting of height: layout_height="wrap_content"

Upvotes: 2

Manoj Srivastava
Manoj Srivastava

Reputation: 670

Yes you can achieve this by key bases,

Logic :

You have to create key like "from_database", When you will get data from database you can just add extra key from_database = true, on the other hand you can add from server from_database= false.

After that you can use method getviewtype() and pass type 0 : 1 on the bases of from_database key and you can exactly what you want .

Hope it helps you.

Upvotes: 2

Related Questions