【问题标题】:Get the Highest 10 Value's From Database and show in RecyclerView从数据库中获取最高 10 个值并在 RecyclerView 中显示
【发布时间】:2019-08-24 09:31:29
【问题描述】:

我在 Top Child 中有 UID。在 Top Child 下,我还有 2 个孩子:Name 和 Exchange。我想获得 Top Exchange 值并在 recyclerview 中显示它们。最高的交换将在顶部,第二个将在第二个位置,第三个将在第三个。我正在使用 firebaserecycleradapter 连续获取所有值。但我想将最高值降至最低。

这是数据库结构:

这里是类:

TopRef = FirebaseDatabase.getInstance().getReference().child("Top");
        recyclerView = views.findViewById(R.id.topRec);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(layoutManager);


        Query query = TopRef.orderByChild("Exchange").limitToLast(20);
        FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<TopAdapter>()
                .setQuery(query,TopAdapter.class)
                .build();


        adapter = new FirebaseRecyclerAdapter<TopAdapter, TopFragment.TopAdapterHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull final TopFragment.TopAdapterHolder holder, int position, @NonNull TopAdapter model) {
                String userIds = getRef(position).getKey();
                assert userIds != null;
                TopRef.child(userIds).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (dataSnapshot.hasChild("Name")){
                            String name = dataSnapshot.child("Name").getValue(String.class);
                            Long exchange = dataSnapshot.child("Exchange").getValue(Long.class);




                            holder.Name.setText(name);
                            holder.Exchange.setText(String.valueOf(exchange));




                        }


                    }

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

                    }
                });

            }




            @NonNull
            @Override
            public TopFragment.TopAdapterHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.topview,viewGroup,false);
                return new TopFragment.TopAdapterHolder(view);
            }
        };



        recyclerView.setAdapter(adapter);

这是适配器类:

public class TopAdapter {
    String Name;
    String Exchange;



    public TopAdapter() {

    }


    public TopAdapter(String name, String exchange) {
        Name = name;
        Exchange = exchange;
    }

    public String getName() {
        return Name;
    }

    public String getExchange() {
        return Exchange;
    }
}

崩溃日志:发现两个 getter 或属性区分大小写冲突的字段:exchange

【问题讨论】:

  • 请不要描述您的数据库的外观,而是将您的数据库结构添加为 JSON 文件或至少作为屏幕截图。
  • @AlexMamo Bro 我现在没有任何数据。这就是为什么写结构
  • @AlexMamo 检查
  • TopRef 是如何定义的?
  • TopRef= FirebaseDatabase.getInstance().getReference().child("Top");

标签: java android firebase firebase-realtime-database


【解决方案1】:

按降序排列数据的最简单方法是在客户端。为了根据Exchange 属性的最大值获取Top 子项中的所有对象,首先,您需要使用查询,然后选择三个选项之一。因此,不要将 TopRef 传递给您的 setQuery() 方法,而是传递以下查询:

Query query = TopRef.orderByChild("Exchange").limitToLast(20);

如您所见,默认情况下,Firebase 使用此查询按给定属性按升序对结果进行排序。 Firebase 中没有按降序排序的方法,但可以进行的调整很少。

如果您使用RecyclerView 来显示数据,最简单的方法是使用以下代码:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);

这种方法会直接在您的RecyclerView 中颠倒顺序。

另一种方法是创建自己的适配器,扩展 FirebaseListAdapter 并覆盖 getItem() 方法。

另一种方法是从数据库中获取数据,将其添加到CollectionList 将是一个很好的解决方案,然后使用Collections.reverse(yourList);。在这种情况下,您将失去 Firebase-UI 的功能。

编辑:

FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<TopAdapter>()
        .setQuery(query,TopAdapter.class) //Changed
        .build();

【讨论】:

  • 你能告诉我应该在哪里添加查询吗?作为我的代码,我已经有一个查询吧?
  • 不,您没有查询。您的TopRef 是一个简单的参考,不是一个查询。您应该使用查询,以便您可以订购/限制结果。没有其他方法可以做到这一点。
  • 你能修改我的代码吗?好像查询值我如何在 recyclerview 中显示。我不熟悉查询和 Firebase 回收器适配器。
  • 有什么信息?
  • 等我上传完整课程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多