Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在顶部显示特定的recyclerview项目?_Java_Android_Arrays_Android Recyclerview_Adapter - Fatal编程技术网

Java 如何在顶部显示特定的recyclerview项目?

Java 如何在顶部显示特定的recyclerview项目?,java,android,arrays,android-recyclerview,adapter,Java,Android,Arrays,Android Recyclerview,Adapter,假设我有一个关于膳食列表的web请求,并使用Recyclerview实现,现在如果我想对顶部的特定项目进行排序/移动,该怎么办 膳食:意大利面食|类型:意大利面食|价格:20$ 餐:热狗披萨|类型:披萨|价格:10$ 餐:汉堡|类型:快餐|价格:30$ 膳食:米饭|类型:午餐|价格:18$ 膳食:Mac&Cheese|类型:午餐|价格:17$ 餐:奶酪汉堡|类型:快餐|价格:8$ 例如,我想要的是,每一种有快餐和比萨饼的物品都显示在列表的顶部,然后是其他物品 我在哪里执行这个排序逻辑,它是在

假设我有一个关于膳食列表的web请求,并使用Recyclerview实现,现在如果我想对顶部的特定项目进行排序/移动,该怎么办


膳食:意大利面食|类型:意大利面食|价格:20$

餐:热狗披萨|类型:披萨|价格:10$

餐:汉堡|类型:快餐|价格:30$

膳食:米饭|类型:午餐|价格:18$

膳食:Mac&Cheese|类型:午餐|价格:17$

餐:奶酪汉堡|类型:快餐|价格:8$


例如,我想要的是,每一种有
快餐
比萨饼
的物品都显示在列表的顶部,然后是其他物品

我在哪里执行这个排序逻辑,它是在适配器内部还是在recyclerview的活动中?此函数是否有类似于
moveToTop()
的现有方法可以这样使用:

for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      item.moveToTop(); 
   }

}
for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      int index = dataList.indexOf(item);
      dataList.remove(index);
      dataList.add(0, item);
      adapter.notifyDataSetChanged()
   }

}
可能吗


更新2 我发现,在这些情况下,我为recyclerview找到了一个方法,它是接口的一个特殊参数
SortedListAdapterCallback

if (homeData.size() > 0) {

            Collections.sort(homeData, Collections.reverseOrder(new SortedListAdapterCallback<HomeItemModel>(adapter) {
              @Override
              public int compare(HomeItemModel o1, HomeItemModel o2) {

               int weight1;
               int weight2;

               if(item1.getType.equals("fast food") || item1.getType.equals("pizza")){
                   weight1 = 1;
               }else{
                   weight1 = 0;
               }

               if(item2.getType.equals("fast food") || item2.getType.equals("pizza")){
                weight2 = 1;
               }else{
                weight2 = 0;
               }

                if (weight1 == weight2)
                   return 0;
                else if (weight1 > weight2)
                   return 1;
                else
                   return -1;

                 }

              @Override
              public boolean areContentsTheSame(HomeItemModel oldItem, HomeItemModel newItem) {
                return false;
              }

              @Override
              public boolean areItemsTheSame(HomeItemModel item1, HomeItemModel item2) {
                return false;
              }
            }));

          }
if(homeData.size()>0){
Collections.sort(家庭数据、集合.reverseOrder)(新的SortedListAdapterCallback(适配器){
@凌驾
公共整数比较(HomeItemModel o1、HomeItemModel o2){
int权重1;
int权重2;
if(item1.getType.equals(“快餐”)| | item1.getType.equals(“比萨饼”)){
权重1=1;
}否则{
权重1=0;
}
if(item2.getType.equals(“快餐”)| | item2.getType.equals(“比萨饼”)){
权重2=1;
}否则{
权重2=0;
}
如果(权重1==权重2)
返回0;
否则如果(权重1>权重2)
返回1;
其他的
返回-1;
}
@凌驾
公共布尔值是相同的内容(HomeItemModel oldItem、HomeItemModel newItem){
返回false;
}
@凌驾
公共布尔项相同(HomeItemModel项1、HomeItemModel项2){
返回false;
}
}));
}
这里唯一的问题是,顶部的订单。。!它们表现为:

for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      item.moveToTop(); 
   }

}
for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      int index = dataList.indexOf(item);
      dataList.remove(index);
      dataList.add(0, item);
      adapter.notifyDataSetChanged()
   }

}
  • 快餐
  • 披萨
  • 披萨
  • 快餐
  • 披萨
  • 快餐
  • 。。。名单的其余部分
我想让他们表现得井然有序。。像这样:

  • 快餐//还是先吃比萨饼
  • 快餐
  • 快餐
  • 披萨
  • 披萨
  • 披萨
  • 。。。名单的其余部分

这可以做到吗?

Arraylist中没有像
moveToTop()
这样简单的方法。但是您可以手动移动数据

您可以这样做:

for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      item.moveToTop(); 
   }

}
for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      int index = dataList.indexOf(item);
      dataList.remove(index);
      dataList.add(0, item);
      adapter.notifyDataSetChanged()
   }

}

希望有帮助:)

Arraylist中没有像
moveToTop()
这样简单的方法。但是您可以手动移动数据

您可以这样做:

for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      item.moveToTop(); 
   }

}
for(Meals item: dataList){

   if (item.getType.equals("fast food") || item.getType.equals("pizza")){
      int index = dataList.indexOf(item);
      dataList.remove(index);
      dataList.add(0, item);
      adapter.notifyDataSetChanged()
   }

}

希望有帮助:)

在您的POJO课程中创建一个比较器

public static class CustomComparator implements Comparator<Meals> {
    public int compare(Meals  item1, Meals  item2) {

        int weight1;
        int weight2;

        if(item1.getType.equals("fast food") || item1.getType.equals("pizza")){
            weight1 = 1;
        }else{
            weight1 = 0;
        }

        if(item2.getType.equals("fast food") || item2.getType.equals("pizza")){
            weight2 = 1;
        }else{
            weight2 = 0;
        }


        if (weight1 == weight2)
            return 0;
        else if (weight1 > weight2)
            return 1;
        else
            return -1;
    }
}
编辑 如果你想先吃所有的快餐,然后吃比萨饼,然后是所有的清单 然后调整排序逻辑,如下所示

        if(item1.getType.equals("fast food")){
            weight1 = 2;
        }else if (item1.getType.equals("pizza")){
            weight1 = 1;
        } else {
            weight1 = 0;
        }

        if(item2.getType.equals("fast food")){
            weight2 = 2;
        }else if (item2.getType.equals("pizza")){
            weight2 = 1;
        } else{
            weight2 = 0;
        }

在POJO类中创建一个比较器

public static class CustomComparator implements Comparator<Meals> {
    public int compare(Meals  item1, Meals  item2) {

        int weight1;
        int weight2;

        if(item1.getType.equals("fast food") || item1.getType.equals("pizza")){
            weight1 = 1;
        }else{
            weight1 = 0;
        }

        if(item2.getType.equals("fast food") || item2.getType.equals("pizza")){
            weight2 = 1;
        }else{
            weight2 = 0;
        }


        if (weight1 == weight2)
            return 0;
        else if (weight1 > weight2)
            return 1;
        else
            return -1;
    }
}
编辑 如果你想先吃所有的快餐,然后吃比萨饼,然后是所有的清单 然后调整排序逻辑,如下所示

        if(item1.getType.equals("fast food")){
            weight1 = 2;
        }else if (item1.getType.equals("pizza")){
            weight1 = 1;
        } else {
            weight1 = 0;
        }

        if(item2.getType.equals("fast food")){
            weight2 = 2;
        }else if (item2.getType.equals("pizza")){
            weight2 = 1;
        } else{
            weight2 = 0;
        }

你必须对你的名单进行排序。你决定怎么做取决于你看看这个答案:虽然它不是特定于android的,但它可能会帮助你对你的列表进行排序。你决定怎么做取决于你看看这个答案:虽然它不是特定于android的,但它可能会帮助你不工作,但列表没有排序?你确定这个逻辑吗?列表不必排序<代码>排序函数将根据比较器逻辑对它们进行排序。你可以自己检查逻辑是否需要这样的东西?我解决了,批准编辑。。你能帮我解决这个小问题吗。。!把你问题的最后一部分发出来,在例子中我有个问题。。膳食类型是手动设置的,但在我的真实代码中,它们不是。首先,这是兴趣爱好而不是膳食类型,用户可以在应用程序启动后从一个列表中进行选择,在下一个屏幕中,选定的兴趣爱好将显示在数据列表的顶部,然后是其他。。!我尝试了一些soulton,但都不起作用,这里的要点中的一个,它只显示嗜好列表中的第一项,而忽略了选择的另一项。!?请帮我做这个。。不起作用,列表没有排序?你确定这个逻辑吗?列表不必排序<代码>排序函数将根据比较器逻辑对它们进行排序。你可以自己检查逻辑是否需要这样的东西?我解决了,批准编辑。。你能帮我解决这个小问题吗。。!把你问题的最后一部分发出来,在例子中我有个问题。。膳食类型是手动设置的,但在我的真实代码中,它们不是。首先,这是兴趣爱好而不是膳食类型,用户可以在应用程序启动后从一个列表中进行选择,在下一个屏幕中,选定的兴趣爱好将显示在数据列表的顶部,然后是其他。。!我尝试了一些soulton,但都不起作用,这里的要点中的一个,它只显示嗜好列表中的第一项,而忽略了选择的另一项。!?请帮我做这个。。没用,我说了