Fernanda Martínez
Fernanda Martínez

Reputation: 217

Filter elements from Recyclerview with Firebase Attributes

Am looking for a way to filter the items on my recyclerview if an attribute stored for each item on firebase database is true. I've been searching for a way to do it on the adapter, but couldn't find one.

for example, if i have 30 fruits, id like to show only the fresh ones.

Deeper on my codes, if its possible, id also like to change this conditional for the activity it comes from. like if i came from user, id like to get only the fresh fruits items, but if i came from admin, id like to get rotten fruits.

this is my adapter

public class MisReclamoFirebaseAdapter extends RecyclerView.Adapter<MisReclamoFirebaseAdapter.MyViewHolder> {

    Context context;
    ArrayList<ReclamoFirebase> reclamos;

    public MisReclamoFirebaseAdapter(Context c , ArrayList<ReclamoFirebase> p)
    {
        context = c;
        reclamos = p;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.reclamo_item,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.descripcion.setText(reclamos.get(position).getDescripcion());
        holder.depto.setText(reclamos.get(position).getDept());
        holder.prodserv.setText(reclamos.get(position).getProducto());
        Picasso.get().load(reclamos.get(position).getFoto()).into(holder.fotoRec);
    }

    @Override
    public int getItemCount() {
        return reclamos.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder
    {
        TextView depto, descripcion, prodserv;
        ImageView fotoRec;
        public MyViewHolder(View itemView) {
            super(itemView);
            depto = (TextView) itemView.findViewById(R.id.deptoRec);
            descripcion = (TextView) itemView.findViewById(R.id.descripcionRec);
            prodserv= (TextView) itemView.findViewById(R.id.prodservRec);
            fotoRec = (ImageView) itemView.findViewById(R.id.fotoRec);
         }
    }
}

and this is the class

public class HistorialReclamosActivity extends AppCompatActivity {
    private MisReclamoFirebaseAdapter adapter;
    DatabaseReference reference;
    RecyclerView recyclerView;
    ArrayList<ReclamoFirebase> list;
    FirebaseDatabase database = FirebaseDatabase.getInstance();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_historial_reclamos_consumidor);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerViewMisReclamos);
        recyclerView.setLayoutManager( new LinearLayoutManager(this));
        reference = FirebaseDatabase.getInstance().getReference().child("Reclamos");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                list = new ArrayList<ReclamoFirebase>();
                for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren())
                {
                    ReclamoFirebase p = dataSnapshot1.getValue(ReclamoFirebase.class);
                    list.add(p);
                }
                adapter = new MisReclamoFirebaseAdapter(HistorialReclamosActivity.this,list);
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(HistorialReclamosActivity.this, "Algo salió mal", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Upvotes: 0

Views: 230

Answers (1)

Frank van Puffelen
Frank van Puffelen

Reputation: 598740

If your JSON has a property that you want to filter on, it's typically best to do that in a database query. For example, if for each ReclamoFirebase you have a property state which is fresh for fresh produce, you could filter with:

reference = FirebaseDatabase.getInstance().getReference().child("Reclamos");
Query query = reference.orderByChild("state").equalTo("fresh");
query.addValueEventListener(new ValueEventListener() {
  ...

The rest of your code will remain the same in this case.

For more on this see the Firebase documentation on ordering and filtering data.

Upvotes: 1

Related Questions