【问题标题】:Display Namelist In Recyclerview under each letter in alphabetic Order Android在 Recyclerview 中按字母顺序在每个字母下显示名称列表 Android
【发布时间】:2016-03-12 13:41:22
【问题描述】:

我有联系人列表,必须在每个字母下按字母显示,如图所示

如何在 RecyclerView 中执行此操作,请提出解决方案。谢谢

【问题讨论】:

  • 嘿..你能分享你做的代码吗,我也需要做吗?

标签: android android-recyclerview alphabetical


【解决方案1】:
  1. 按名称对数据进行排序
  2. 使用数据通过列表迭代,并在当前项目的第一个字母 != 下一个项目的第一个字母时插入特殊类型的对象。
  3. 在您的Adapter 中,当项目为“特殊”时放置特殊视图。

【讨论】:

  • 有人可以分享上述方法的 sn-p 对开发来说是新的
  • 可以用 cursoradapter 做吗
  • 有没有一种方法可以在不向列表中添加对象的情况下向 recyclerview 添加标题?像'addHeaderView'?
【解决方案2】:

【讨论】:

  • 你这个是最合适的。但我已经完成了这个项目
【解决方案3】:

这是我在@divers 的帖子之后所做的:

正如他所说,我将一个团队列表传递给适配器,该适配器已排序并在下一个名称之前添加字母。

这是他用来设置适配器的代码

void updateUI(ArrayList<TeamMember> teamMembers) {



        adapter = new TeamMemberActivityAdapter(this, addAlphabets(sortList(teamMembers)));
        recList.setAdapter(adapter);
        recList.setVisibility(View.VISIBLE);
        spinningProgressView.setVisibility(View.GONE);
    } 

对从服务器获取的团队列表进行排序的代码如下:

 ArrayList<TeamMember> sortList(ArrayList<TeamMember> list) {
        Collections.sort(list, new Comparator<TeamMember>() {
            @Override
            public int compare(TeamMember teamMember1, TeamMember teamMember2) {
                return teamMember1.getFullname().compareTo(teamMember2.getFullname());
            }
        });
        return list;
    }

在将字母添加到列表中时,我正在设置一个类型值以了解其字母或团队名称,以在适配器内部检查以显示相应的布局。代码如下所示:

ArrayList<TeamMember> addAlphabets(ArrayList<TeamMember> list) {
        int i = 0;
        ArrayList<TeamMember> customList = new ArrayList<TeamMember>();  TeamMember firstMember = new TeamMember();
        firstMember.setFullname(String.valueOf(list.get(0).getFullname().charAt(0)));
        firstMember.setType(1);
        customList.add(firstMember);
        for (i = 0; i < list.size() - 1; i++) {
            TeamMember teamMember = new TeamMember();
            char name1 = list.get(i).getFullname().charAt(0);
            char name2 = list.get(i + 1).getFullname().charAt(0);
            if (name1 == name2) {
                list.get(i).setType(2);
                customList.add(list.get(i));
            } else {
                list.get(i).setType(2);
                customList.add(list.get(i));
                teamMember.setFullname(String.valueOf(name2));
                teamMember.setType(1);
                customList.add(teamMember);
            }
        }
        list.get(i).setType(2);
        customList.add(list.get(i));
        return customList;
    }

最后在你的适配器内部检查项目是团队成员名称还是字母,并显示相应的布局,如下所示:

  @Override
    public int getItemViewType(int position) {
        int viewType = 0;
        if (mMembers.get(position).getType() == TYPE_LETTER) {
            viewType = TYPE_LETTER;
        } else if (mMembers.get(position).getType() == TYPE_MEMBER) {
            viewType = TYPE_MEMBER;
        }

        return viewType;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

        LayoutInflater mInflater = LayoutInflater.from(viewGroup.getContext());

        switch (viewType) {
            case TYPE_LETTER:
                ViewGroup vGroupImage = (ViewGroup) mInflater.inflate(R.layout.board_team_letter_item, viewGroup, false);
                ViewHolderLetter image = new ViewHolderLetter(vGroupImage);
                return image;
            case TYPE_MEMBER:
                ViewGroup vGroupText = (ViewGroup) mInflater.inflate(R.layout.board_team_member_item, viewGroup, false);
                ViewHolderMember text = new ViewHolderMember(vGroupText);
                return text;
            default:
                ViewGroup vGroupText2 = (ViewGroup) mInflater.inflate(R.layout.board_team_member_item, viewGroup, false);
                ViewHolderMember text1 = new ViewHolderMember(vGroupText2);
                return text1;

        }
    }

希望这可以帮助你。万事如意

【讨论】:

  • 非常感谢@bearded beast
  • 嘿,当您返回不同的 Viewholder 时,您如何在 onBindViewHolder 方法中处理这个问题。我试过了,但我只是卡在这一点上。
  • 在 onBindViewHolder 中,您必须根据列表中项目的类型选择要显示的布局。这就是这里所做的。
【解决方案4】:

你可以用这个library来实现它。

有一个完整的示例here 说明如何添加标题。

如果要实现搜索功能,还有一个完整的例子here,结果如下:

【讨论】:

    【解决方案5】:

    我目前正在使用this。它非常容易实现,与 RecyclerView 适配器兼容,而且非常轻巧,几乎不能称它为库!

    【讨论】:

      【解决方案6】:

      比较您的模型并从标题中获取第一个字符 ....

      private void getHeaderListLatter(ArrayList<CountriesModel> usersList) {
      
              Collections.sort(usersList, new Comparator<CountriesModel>() {
                  @Override
                  public int compare(CountriesModel user1, CountriesModel user2) {
                      return String.valueOf(user1.name.charAt(0)).toUpperCase().compareTo(String.valueOf(user2.name.charAt(0)).toUpperCase());
                  }
              });
      
              String lastHeader = "";
      
              int size = usersList.size();
      
              for (int i = 0; i < size; i++) {
      
                  CountriesModel user = usersList.get(i);
                  String header = String.valueOf(user.name.charAt(0)).toUpperCase();
      
                  if (!TextUtils.equals(lastHeader, header)) {
                      lastHeader = header;
                      mSectionList.add(new CountriesModel(header,true));
                  }
      
                  mSectionList.add(user);
              }
          }
      

      在你的适配器中 getItemViewType 布局像这样......

      @Override
          public int getItemViewType(int position) {
              if (mCountriesModelList.get(position).isSection) {
                  return SECTION_VIEW;
              } else {
                  return CONTENT_VIEW;
              }
          }
      

      供完整参考。 https://github.com/sayanmanna/LetterSectionedRecyclerView

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多