簡體   English   中英

如何在頂部顯示特定的recyclerview項目?

[英]How do show specific recyclerview items at the top?

比方說,我有一個Web請求,可獲取一份食物清單,並使用Recyclerview實現,現在,如果我想在頂部排序/移動特定項目該怎么辦。


餐點: 意大利面食 | 類型: 面食 | 價格: 20 $

餐: 熱狗比薩 | 類型: 披薩 | 價格: 10 $

餐: 漢堡 | 類型: 快餐 | 價格: 30 $

餐點: 米飯 | 類型: 午餐 | 價格: 18 $

餐: Mac和奶酪 | 類型: 午餐 | 價格: 17 $

餐: CheeseBurger | 類型: 快餐 | 價格: 8 $


因此,例如,我想要的是每一個具有fast foodpizza類型的商品都顯示在列表的頂部,然后顯示其余部分。

我在哪里執行此排序邏輯,它是在適配器內部還是在recyclerview的活動中? 有沒有像該函數那樣的現有方法moveToTop()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;
              }
            }));

          }

這里唯一的問題是頂部的訂單。 他們顯示如下:

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

我希望他們顯示有序..像這樣:

  • 快餐//首先是披薩
  • 快餐
  • 快餐
  • 比薩
  • 比薩
  • 比薩
  • ...列表的其余部分

能做到嗎..?

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

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

}

希望能幫助到你:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM