我正在构建一个应用程序。我有一个包含大量产品的 Firebase 数据库,每个产品都有一个评级。我将它们显示在 ListView 中,但想按评级对它们进行排序。我是否需要以不同的方式保存它们才能使其发挥作用?
private ListView mTopRatedList;
ArrayList<String> mAllBeers = new ArrayList<>();
DatabaseReference Reference = FirebaseDatabase.getInstance().getReference().child("Beers");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_top_rated);
mTopRatedList =(ListView)findViewById(R.id.topRatedList);
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mAllBeers);
mTopRatedList.setAdapter(arrayAdapter);
arrayAdapter.clear();
Reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
arrayAdapter.clear();
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
//arrayAdapter.add(snapshot.getValue().toString());
Beers beers = snapshot.getValue(Beers.class);
String beerClass = beers.getmName();
Float beerRating = beers.getmRating();
//Collections.sort()
arrayAdapter.add(beerClass+ "User Rating is " + beerRating);
}
arrayAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
最佳答案
从你的代码来看,你的每种啤酒都有一个 rating
数据库中的属性。
在这种情况下,您可以通过执行以下操作来显示按评级排序的啤酒:
Reference.orderByChild("rating").addValueEventListener(new ValueEventListener() {
...
一些注意事项:
- 这将按评分的升序显示啤酒,因此首先显示值(value)最低的啤酒。如果您想首先显示评分最高的啤酒,Firebase 没有有用于降序排序的内置运算符。因此,您必须通过在客户端代码中反转结果,或者为此目的在数据库中包含反向评级来解决这个问题。在后一种情况下,您可以对倒排评级进行排序,然后显示常规评级。
- 要使其正常工作,重要的是
rating
value 是一个数字,而不是存储为字符串。当存储为字符串时,它可能适用于最大为 9 的值,但之后您会遇到数字排序与 Firebase 用于字符串的字典顺序不同的情况。 - 请永远不要离开
onCancelled
空的,因为它隐藏了潜在的问题。它的最小实现是public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }
.
关于java - Android Firebase 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60831570/