Reputation: 217
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
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