按喜欢排序数据库列表android

时间:2017-03-20 16:15:20

标签: android database firebase firebase-realtime-database

我正在构建食谱应用程序。我的应用程序中有一个页面,它将Firebase上数据库中的所有配方检索到ListView中。每个食谱都有以下变量:

public String key;
public String uid;
public String title;
public String type;
public String ingredients;
public String instructions;
public int likes;

这是检索所有数据的函数:

//Retrieve Data from database
public void retriveData() {
    database.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            recipes = new ArrayList<Recipe>();
            for(DataSnapshot data : dataSnapshot.getChildren()) {
                Recipe r = data.getValue(Recipe.class);
                recipes.add(r);
            }
            allRecipeAdapter = new AllRecipeAdapter(AllRecipeActivity.this,0,0,recipes);
            lv.setAdapter(allRecipeAdapter);
        }
     }
 }

现在我想创建另一个也有ListView的屏幕,我想按喜欢的nubmer排序Recipes,然后在ListView中输入前10个食谱。 我在Google上搜索了我找到了OrderByValue函数,但我无法弄清楚如何使用它我意识到如何工作但我无法在我的项目中实现这一点。

3 个答案:

答案 0 :(得分:1)

您可以使用def shuffle(L): x, L_first, L_next, L = len(L), L[:(len(L)//2)], L[(len(L)//2):], [] while len(L) != x: L.extend([L_first.pop(0), L_next.pop(0)]) return L 对列表进行排序,然后在Comparator显示之前获取10个第一个元素的子列表:

ListView

答案 1 :(得分:1)

Java7:

Collections.sort(list, new Comparator<Recipe>() {
    @Override
    public int compare(Recipe r1, Recipe r2) {
        if (r1.getLikes() > r2.getLikes())
            return 1;
        if (r1.getLikes() < r2.getLikes()
            return -1;
        return 0;
    }
});

Java8(使用lambda):

recipes.stream()
    .sorted((r1, r2) -> Integer.compare(r1.getLikes(),
                    r2.getLikes()))

答案 2 :(得分:1)

GaëtanMaisse和KLHauser为您提供了纯客户端代码的解决方案。这是使用Firebase数据库查询的替代方法,这意味着在服务器上发生了和过滤的排序:

// assuming that database refers to the list of all recipe
Query topRecipes = database.orderByChild("likes").limitToLast(10);
topRecipes.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        recipes = new ArrayList<Recipe>();
        for(DataSnapshot data : dataSnapshot.getChildren()) {
            Recipe r = data.getValue(Recipe.class);
            // add the recipe to the front of the list
            recipes.add(0, r);
        }
        allRecipeAdapter = new AllRecipeAdapter(AllRecipeActivity.this,0,0,recipes);
        lv.setAdapter(allRecipeAdapter);
    }
 }

由于Firebase查询始终按升序对项目进行排序,因此查询将使用 last 10个项目 - 这些项目具有最高的相似数量。要反转这些项目,代码会将每个项目插入到列表中,而不是将它们附加到结尾。