有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


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

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

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

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

餐:Mac&;奶酪类型:午餐价格:17$

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


举个例子,我想要的是每一个有fast foodpizza类型的项目显示在列表的顶部,然后是其他的

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

for(Meals item: dataList){

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

}

可能吗


更新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;
              }
            }));

          }

这里唯一的问题是,顶部的订单。。!它们表现为:

  • 快餐
  • 披萨
  • 披萨
  • 快餐
  • 披萨
  • 快餐
  • 。。。名单的其余部分

我希望他们表现得井然有序。。像这样:

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

这能做到吗


共 (1) 个答案

  1. # 1 楼答案

    在你的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;
        }
    }
    

    在设置适配器调用之前,请先将数据列表传递给适配器构造函数

    Collections.sort(yourDataLIst, Collections.reverseOrder(new Meals.CustomComparator()));
    

    编辑 如果你想先吃所有的快餐,然后吃披萨,然后是所有的清单 然后调整你的排序逻辑如下

            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;
            }