Android 在Recyclerview中按字母顺序显示每个字母下的姓名列表

Android 在Recyclerview中按字母顺序显示每个字母下的姓名列表,android,android-recyclerview,alphabetical,Android,Android Recyclerview,Alphabetical,我有联系人列表,必须按字母顺序显示在每个字母表下,如图所示 如何在RecyclerView中执行此操作,请提出解决方案。谢谢 按名称对包含数据的列表进行排序 使用数据通过列表进行迭代,并在当前项目第一个字母出现时就位!=下一项的第一个字母,插入特殊类型的对象 当项目为“特殊”时,在适配器内放置特殊视图 我希望这就是你想要的。这就是我在@divers的帖子中所做的: 正如他提到的,我将一个团队列表传递给适配器,该列表被排序,字母表被添加到下一个名称之前 这是用于设置适配器的代码 void upd

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

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

  • 按名称对包含数据的列表进行排序
  • 使用数据通过列表进行迭代,并在当前项目第一个字母出现时就位!=下一项的第一个字母,插入特殊类型的对象
  • 当项目为“特殊”时,在
    适配器内放置特殊视图

  • 我希望这就是你想要的。

    这就是我在@divers的帖子中所做的:

    正如他提到的,我将一个团队列表传递给适配器,该列表被排序,字母表被添加到下一个名称之前

    这是用于设置适配器的代码

    void updateUI(ArrayList<TeamMember> teamMembers) {
    
    
    
            adapter = new TeamMemberActivityAdapter(this, addAlphabets(sortList(teamMembers)));
            recList.setAdapter(adapter);
            recList.setVisibility(View.VISIBLE);
            spinningProgressView.setVisibility(View.GONE);
        } 
    

    希望这能对你有所帮助。你可以用这个来实现它

    这里有一个关于如何添加标题的完整示例

    如果您想实现搜索功能,还有一个完整的示例,结果如下:


    我目前正在使用。它非常容易实现,与RecyclerView适配器兼容,而且非常轻量级,您几乎不会称之为库

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

    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);
            }
        }
    
    供完整参考。

    是的,这是最合适的。但是我已经完成了这个项目嘿..你能分享你已经完成的代码吗,我也需要这样做吗?非常感谢@bearded Beats他们,当你返回不同的Viewholder时,你如何在onBindViewHolder方法中处理这个问题。我试过了,但我只是停留在这一点上。在onBindViewHolder中,您必须根据列表中项目的类型选择要显示的布局。这就是这里要做的。有人可以分享上面方法的片段吗?我对devcan来说是新的,可以使用cursoradapter吗?有没有一种方法可以在不向列表中添加对象的情况下向recyclerview添加标题?比如“addHeaderView”?
    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;
    
            }
        }
    
    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);
            }
        }
    
    @Override
        public int getItemViewType(int position) {
            if (mCountriesModelList.get(position).isSection) {
                return SECTION_VIEW;
            } else {
                return CONTENT_VIEW;
            }
        }