首页 > 解决方案 > ListView Displays all of the data from Firebase issue

问题描述

I have created a spinner that holds a list of sectors and when selecting one it should display the items that belong to that specific sector, I think there is an issue with my query that fetches data from firebase real time database, as it returns all of the items in a list

tree view

Emulator list view

On create Code

 FirebaseApp.initializeApp(this);
    listView = findViewById(R.id.listView);

    spnSector = findViewById(R.id.spnSector);

    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this,
            R.array.sector_array, android.R.layout.simple_spinner_item);

    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spnSector.setAdapter(adapter1);

    spnSector.setOnItemSelectedListener(this);

Location Class

public class Location {

public String sector;
public String area;

public double longitude;
public double latitude;

public String getSector() {
    return sector;
}

public String getArea() {
    return area;
}

public double getLongitude() {
    return longitude;
}

public double getLatitude() {
    return latitude;
}

public Location()
{

}

public Location(String sector , String area, double longitude, double latitude)
{
    this. sector = sector;
    this. area = area;
    this.longitude = longitude;
    this.latitude = latitude;
}

@Override
public String toString() {
    return "\n Sector='" + sector + '\'' +
            ",Area Name='" + area + '\'' +
            ",Longitude='" + longitude + '\'' +
            ",Latitude=" + latitude + "\n";

}

Case class

    public class Case {

    private String caseName;
    private String date;
    private String caseStatus;
    private Location location;

    public String getDate() {
        return date;
    }

    public String getCaseName() {
        return caseName;
    }

    public String getCaseStatus() {
        return caseStatus;
    }

    public Location getLocation() {
        return location;
    }

    public Case() {
    }


    public Case(String caseName,String date, String caseStatus , Location location) {
        this.caseName = caseName;
        this.date = date;
        this.caseStatus = caseStatus;
        this.location = location;
    }

    @Override
    public String toString() {
        return "\nCase Date=" + date + "\n" +
                "Area=" + location.area + "\n" +
                "Latitude=" + location.latitude + "\n" +
                "Longitude=" + location.longitude + "\n"+
                "Sector=" + location.sector + "\n" +
                "Status=" + caseStatus + "\n" +
                "Case name=" + caseName + "\n" ;


    }
}

Search query Method

 public void doSearch3(View view) {

    String sector = spnSector.getSelectedItem().toString();

    final ArrayList<Case> cases = new ArrayList<>();


    final ArrayAdapter adapter = new ArrayAdapter<> (SearchCase.this, android.R.layout.simple_list_item_1, cases);

    databaseReference = FirebaseDatabase.getInstance().getReference();

    Query query = databaseReference.child("/Cases");
    query.orderByChild("/location/sector").equalTo(sector);
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()){

                Case case1 = ds.getValue(Case.class);
                cases.add(case1);

            }
            listView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });



}

I was able to do it with firestore, but I must do it in Realtime, i think the query is wrong

标签: androidfirebaselistviewfirebase-realtime-databasespinner

解决方案


查询构建方法,例如orderByChildequalTo返回一个新Query对象,因此您必须更新query变量以引用该新对象。

Query query = databaseReference.child("/Cases");
query = query.orderByChild("/location/sector").equalTo(sector);
query.addValueEventListener(new ValueEventListener() {

推荐阅读