【问题标题】:How do show specific recyclerview items at the top?如何在顶部显示特定的 recyclerview 项目?
【发布时间】:2017-09-14 17:37:15
【问题描述】:

假设我有一个膳食列表的网络请求并使用 Recyclerview 实现,现在如果我想在顶部对特定项目进行排序/移动..!


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

膳食: 热狗披萨 |类型: 披萨 |价格: 10 美元

膳食: 汉堡 |类型: 快餐 |价格: 30 美元

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

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

膳食: 芝士汉堡 |类型: 快餐 |价格: 8 美元


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

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

for(Meals item: dataList){

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

}

有可能吗?


更新 2

我想通了,在这些情况下,我找到了一个方法,一个特殊的接口参数,用于recyclerviewSortedListAdapterCallback

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

          }

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

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

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

  • 快餐//或先吃比萨
  • 快餐
  • 快餐
  • 披萨
  • 披萨
  • 披萨
  • ...列表的其余部分

这样可以吗..?

【问题讨论】:

标签: java android arrays android-recyclerview adapter


【解决方案1】:

在你的 POJO 类 Meals 中创建一个比较器

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

【讨论】:

  • 不工作,列表没有排序?你确定这个逻辑吗?
  • 列表不必订购。 sort 函数将根据您的比较器逻辑对它们进行排序。你可以自己检查逻辑你是否想要这样的东西?
  • 我解决了,批准编辑..你能帮忙解决这个小问题吗..!
  • 发布问题的最后一部分
  • 我遇到了一个问题,在示例中.. 餐食的类型是手动设置的,但在我的真实代码中它们不是。首先,它是爱好而不是膳食类型,用户可以在应用程序启动后从列表中进行选择,在下一个屏幕中,所选爱好将显示在数据列表的顶部,然后是其余的..!我尝试了一些灵魂,但它们没有用,这里的要点中的一个,它只显示爱好数组列表中的第一项,而忽略了另一个选择。!?请帮我解决这个问题。gist.github.com/AlaaZarifa/f03400c35f32288eb9f5b25391aed2de
【解决方案2】:

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

}

希望对你有帮助:)

【讨论】:

  • 不行,我把recyclerview设置成adapter后放到activity里面了~!应该在别处吧!?
  • 要更新 UI,您必须调用“notifyDataSetChanged()”。看我的回答。如果没有解决您的问题,请发布您的活动代码。
  • 它只在顶部显示了一项,而不是全部..? for 循环中可能缺少什么?查看代码的更新..!
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 2020-10-22
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2015-10-02
相关资源
最近更新 更多