从Firebase获取数据并将其排在前100名

时间:2018-10-15 19:20:00

标签: android firebase firebase-realtime-database firebaseui

这里是我的代码:

 private RecyclerView recycleRank;
private LinearLayoutManager layManRank;
private FirebaseRecyclerAdapter<Word, RankingActivity.RankingViewHolder> recAdapterRank;

...

DatabaseReference personsRef = FirebaseDatabase.getInstance().getReference("Word");
    Query personsQuery = personsRef.orderByChild("count");

    recycleRank.hasFixedSize();
    layManRank = new LinearLayoutManager(this);
    layManRank.setReverseLayout(true);
    layManRank.setStackFromEnd(true);
    recycleRank.setLayoutManager(layManRank);

因此,对于.setReverseLayout,计数以降序显示。没有它,它将以最小的数字开始,然后下降到最高的数字。但这应该是另一回事。

recAdapterRank = new FirebaseRecyclerAdapter<Word, RankingViewHolder>(personsOptions) {
        @Override
        protected void onBindViewHolder(RankingActivity.RankingViewHolder holder, final int position, final Word model) {
            holder.setWord(model.getWord());
            long score = model.getCount();
            holder.setScore(String.valueOf(score));
            holder.setRank(String.valueOf(holder.getAdapterPosition()));
        }

holder.setRank(String.valueOf(holder.getAdapterPosition())); 在此,在排名中输出相应的编号。

因此该活动应如下所示

# Word Score 1 Tree 12 2 Wood 9

但是在我的情况下,因为列表是反向的,所以编号从最高编号开始,然后变为0。

我该如何处理?我需要一个整数数组或类似的东西吗? 怎样才能使排名只有100个单词呢?当前,排名中有来自数据库的所有单词。

谢谢你们

2 个答案:

答案 0 :(得分:0)

这正是我使用Firestore的原因。没有确切的方法可以执行类似的操作:使用Firebase数据库进行myQuery.orderBy(“ field”,DESCENDING)。

您可以通过多种方式来绕过这个问题,首先想到的是Collections.reverse(mylist);

要限制为第100名,请在查询中使用limitToFirst(100)

答案 1 :(得分:0)

好,这样您就可以解决。

Query personsQuery = personsRef.orderByChild("count").limitToLast(100);

感谢@Hocine B

除了要反转它,还可以使用:

recAdapterRank = new FirebaseRecyclerAdapter<Word, RankingViewHolder>(personsOptions) {
    @Override
    protected void onBindViewHolder(RankingActivity.RankingViewHolder holder, final int position, final Word model) {
        holder.setWord(model.getWord());
        long score = model.getCount();
        holder.setScore(String.valueOf(score));

        //Here is the Code
        int realRank = 100 - holder.getAdapterPosition();

        holder.setRank(String.valueOf(realRank));
    }