java - Android Firebase 排序

标签 java android firebase firebase-realtime-database

我正在构建一个应用程序。我有一个包含大量产品的 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/

相关文章:

java - 递归问题

java - Selenium Java - 页面对象模型查询

java - 类文件夹显示在构建路径中,但不显示在项目资源管理器中

android - Espresso 复选框已选中

android - 在文本和 ImageView 之间放置空格

reactjs - FirebaseUI - 在创建用户之前验证显示名称

java - 在没有 Java 中的 KeyEvent 的情况下检测当前是否按下了键 (CTRL)

android - 如何使用 ActiveAndroid 读写外键?

android - 我已经在我的应用程序中更改了 Firebase 名称,但该应用程序仍然加载旧的 Firebase

java - 如何从 firebaserecycleradapter 上的 firebase 数据库中获取数据单击