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

时间:2017-09-13 12:52:45

标签: java android arrays android-recyclerview adapter

让我们说我有网上请求的膳食列表并使用Recyclerview实现,现在如果我想在顶部排序/移动特定项目怎么办...!

用餐: 意大利面食 |键入: 意大利面 |价格: 20 $

用餐: Hotdogs Pizza |输入: 披萨 |价格: 10 $

用餐: 汉堡 |输入: 快餐 |价格: 30美元

用餐: 大米 |输入: 午餐 |价格: 18 $

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

用餐: CheeseBurger |输入: 快餐 |价格: 8 $

例如,我想要的是每个项目fast foodpizza显示在列表顶部,然后是其他项目。!?

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

for(Meals item: dataList){

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

}

有可能吗?

更新2

我发现,在这些情况下,我发现了一个方法,它是recyclelerview的一个特殊的接口参数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;
              }
            }));

          }

这里唯一的问题是顶部的订单..!他们这样表现出来:

  • 快餐
  • 比萨饼
  • 比萨饼
  • 快餐
  • 比萨饼
  • 快餐
  • ......列表的其余部分

我希望他们展示有序......就像这样:

  • 快餐//或比萨饼
  • 快餐
  • 快餐
  • 比萨饼
  • 比萨饼
  • 比萨饼
  • ......列表的其余部分

可以这样做吗??

2 个答案:

答案 0 :(得分:2)

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

在设置适配器之前调用此行,然后将数据列表传递给Adapter构造函数。

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

答案 1 :(得分:0)

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()
   }

}

希望有所帮助:)