Java Android Firebase排序

Java Android Firebase排序,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在构建一个应用程序。我有一个Firebase数据库,里面有很多产品,每个产品都有一个等级。我在列表视图中显示它们,但希望根据它们的评级对它们进行排序。我是否需要以不同的方式保存它们以使其正常工作 private ListView mTopRatedList; ArrayList<String> mAllBeers = new ArrayList<>(); DatabaseReference Reference = FirebaseDatabase.

我正在构建一个应用程序。我有一个Firebase数据库,里面有很多产品,每个产品都有一个等级。我在列表视图中显示它们,但希望根据它们的评级对它们进行排序。我是否需要以不同的方式保存它们以使其正常工作

  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) {

            }
        });


    }
}

private ListView mTopRatedList;
ArrayList mAllBeers=新的ArrayList();
DatabaseReference=FirebaseDatabase.getInstance().getReference().child(“啤酒”);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u top\u rated);
mTopRatedList=(ListView)findViewById(R.id.topRatedList);
final ArrayAdapter ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,mAllBeers);
mTopRatedList.setAdapter(阵列适配器);
arrayAdapter.clear();
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
arrayAdapter.clear();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
//添加(snapshot.getValue().toString());
Beers-Beers=snapshot.getValue(Beers.class);
String beerClass=beers.getmName();
Float beerRating=beers.getmRating();
//Collections.sort()
arrayAdapter.add(beerClass+“用户评级为”+beerRating);
}
arrayAdapter.notifyDataSetChanged();
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
}

从您的代码看,您的每一瓶啤酒在数据库中都有一个
评级属性

在这种情况下,您可以通过执行以下操作来显示按评级订购的啤酒:

Reference.orderByChild("rating").addValueEventListener(new ValueEventListener() {
    ...
请注意:

  • 这将按等级的升序显示啤酒,因此首先显示最低值。如果要首先显示最高等级的啤酒,Firebase没有用于降序排序的内置运算符。因此,您必须通过在客户端代码中反转结果或为此在数据库中包含反向评级来解决这个问题。在后一种情况下,您将根据反向评级进行排序,然后显示常规评级
  • 要使其正常工作,
    评级
    值必须是一个数字,而不是存储为字符串。当存储为字符串时,它可能适用于最大值为9的值,但在此之后,您将遇到数字顺序不同于Firebase将用于字符串的字典顺序的情况
  • 请不要将
    onCancelled
    留空,因为它隐藏了潜在的问题。它的最小实现是
    public void onCancelled(@NonNull-DatabaseError-DatabaseError){throw-DatabaseError.toException();}

从您的代码来看,您的每一瓶啤酒在数据库中都有一个
评级属性

在这种情况下,您可以通过执行以下操作来显示按评级订购的啤酒:

Reference.orderByChild("rating").addValueEventListener(new ValueEventListener() {
    ...
请注意:

  • 这将按等级的升序显示啤酒,因此首先显示最低值。如果要首先显示最高等级的啤酒,Firebase没有用于降序排序的内置运算符。因此,您必须通过在客户端代码中反转结果或为此在数据库中包含反向评级来解决这个问题。在后一种情况下,您将根据反向评级进行排序,然后显示常规评级
  • 要使其正常工作,
    评级
    值必须是一个数字,而不是存储为字符串。当存储为字符串时,它可能适用于最大值为9的值,但在此之后,您将遇到数字顺序不同于Firebase将用于字符串的字典顺序的情况
  • 请不要将
    onCancelled
    留空,因为它隐藏了潜在的问题。它的最小实现是
    public void onCancelled(@NonNull-DatabaseError-DatabaseError){throw-DatabaseError.toException();}

感谢您的回复,我确实尝试过这种方法,但它按降序排列。有没有一种方法可以按值升序呢?我刚刚点击了提交,得到了一个更新。顺便说一句:很高兴看到你将来在这个问题上做了最好的尝试。谢谢你以后会这么做的。我的额定值存储为浮点数。我现在将研究如何在数据库中更改评级。谢谢你的详细回复:)我找到了一种方法来绕过我称之为“收藏”的订单;要反转listview的顺序,我不需要选择此列表中的元素,这样它就可以完美地工作。我会再次感谢你的。这就是我回答中第一个注释中的“在客户端代码中反转结果”,并且当您创建自己的适配器时,这通常是最简单的方法。:)谢谢你的回复,我确实尝试过这种方法,但它是按降序排列的。有没有一种方法可以按值升序呢?我刚刚点击了提交,得到了一个更新。顺便说一句:很高兴看到你将来在这个问题上做了最好的尝试。谢谢你以后会这么做的。我的额定值存储为浮点数。我现在将研究如何在数据库中更改评级。谢谢你的详细回复:)我找到了一种方法来绕过我称之为“收藏”的订单;要反转listview的顺序,我不需要选择此列表中的元素,这样它就可以完美地工作。我会再次感谢你的。这就是我回答中第一个注释中的“在客户端代码中反转结果”,并且当您创建自己的适配器时,这通常是最简单的方法。:)