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

7

我有一个联系人列表,需要按字母顺序显示每个字母下的联系人,如图所示Required answer

请问在RecyclerView中如何实现这一功能?请提供解决方案。谢谢。


嘿,你能分享一下你写的代码吗?我需要做同样的事情。 - Christ
6个回答

10

以下是我根据@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。 - Christ
嗨,你是如何在onBindViewHolder方法中处理它的呢?因为你正在返回不同的Viewholder。我尝试过了,但我现在卡住了。 - shadyinside
在onBindViewHolder中,您必须根据列表中项目的类型选择要显示的布局。这就是这里所做的。 - Nabeel K

10
  1. 按名称对数据列表进行排序
  2. 通过遍历带有数据的列表,并在当前项的第一个字母!=下一项的第一个字母时,插入特殊类型的对象。
  3. 当项目是“特殊”时,在您的Adapter中放置特殊视图。

有人可以分享一下上面方法的片段吗?我是开发新手。 - M.Yogeshwaran
能否使用CursorAdapter实现这个功能? - M.Yogeshwaran
有没有办法在不将对象添加到列表中的情况下向RecyclerView添加标题?就像“addHeaderView”一样? - Roon13

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

完整的参考资料,请查看image https://github.com/sayanmanna/LetterSectionedRecyclerView


5

我目前正在使用 这个。它很容易实现,与RecyclerView适配器兼容,并且非常轻量级,你几乎不会把它称为一个库!


2

1

是的,这个是合适的。但我已经完成了这个项目。 - Nabeel K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接