web-dev-qa-db-ja.com

Recyclerviewの各文字の下にアルファベット順に名前リストを表示Android

示されている画像に示されているように、各アルファベットの下にアルファベットで表示する必要がある連絡先のリストがあります Required answer

RecyclerViewでこれを行うにはどうすればよいですか、解決策を提案してください。ありがとう

7
Nabeel K
  1. データを含むリストを名前で並べ替える
  2. データを使用してリストを反復処理し、現在のアイテムの最初の文字!=次のアイテムの最初の文字の場合に、特別な種類のオブジェクトを挿入します。
  3. アイテムが「特別」である場合、Adapter内に特別なビューを配置します。
6
Divers

これは私が@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;
    }

最後に、アダプター内で、アイテムがteamMember名またはアルファベットであるかどうかを確認し、以下に示すように対応するレイアウトを表示します。

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

        }
    }

これがお役に立てば幸いです。ではごきげんよう

8
Nabeel K

私は現在 this を使用しています。実装は非常に簡単で、RecyclerViewアダプターと互換性があり、ライブラリとは呼べないほど軽量です。

5
Jelle Blaauw

モデルを比較して、タイトルから最初の文字を取得します..。

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

完全な参照用。 imagehttps://github.com/sayanmanna/LetterSectionedRecyclerView

3
Sayan Manna

あなたはこれでそれを達成することができます library

ヘッダーを追加する方法の完全な例 ここ があります。

また、検索機能を実装する場合は、完全な例もあります ここ 、これは結果です:

enter image description here

2
Gustavo

https://github.com/emilsjolander/StickyListHeaders これがあなたの望むものであることを願っています。

1