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

How do show specific recyclerview items at the top?

假设我有一个关于膳食列表的网络请求并使用 Recyclerview 实现,现在如果我想 sort/move 顶部的特定项目怎么办......!


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

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

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

餐点:|输入: 午餐 |价格:18元

餐食:Mac&奶酪|输入: 午餐 |价格:17$

餐点:芝士汉堡|类型: 快餐 |价格:8元


例如,我想要的是每个类型为 fast foodpizza 的项目显示在列表的顶部,然后是其余的..!?

我在哪里执行这个排序逻辑,它是在适配器内部还是在 recyclerview 的 activity 中?是否有像 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;
              }
            }));

          }

这里唯一的问题是顶部的顺序..!他们这样显示:

我希望它们显示有序.. 像这样:

这能做到吗..?

Arraylist中没有像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 中创建一个比较器 class 膳食

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