参考

[WaveSideBar](https://github.com/gjiazhe/WaveSideBar)

场景

在Android开发中会经常用到侧边索引栏,并且根据中文的首字母排序。额。。废话不多说直接贴效果图:

gradle

//侧边栏
implementation 'com.gjiazhe:wavesidebar:1.3'
//拼音
implementation 'com.github.open-android:pinyin4j:2.5.0'

XML中需要配合RecyclerView来使用

 <android.support.v7.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="0dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toBottomOf="@id/tb_title"/><com.gjiazhe.wavesidebar.WaveSideBarandroid:id="@+id/wavesidebar"android:layout_width="match_parent"android:layout_height="0dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintTop_toBottomOf="@id/tb_title"/>

java代码

1.数据封装
我用的语言类是一个enum,我重新封装了下

public class LanguageInfo implements Parcelable {private Language language;//语言private int type = 0;//类型0语言,1 字母...
}

2.设置右边的字母,默认是26个字母,如果需要添加自定义则重新设置

private final static String[] DEFAULT_INDEX_ITEMS = {"#","A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};...mWavesidebar.setIndexItems(DEFAULT_INDEX_ITEMS);

3.PinyinUtil获取首字母的工具类

 /*** 得到中文首字母** @param str* @return*/public static String getPinYinFristHeadChar(String str) {String convert = "";if(str.length()>=1){char word = str.charAt(0);String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);if (pinyinArray != null) {convert += pinyinArray[0].charAt(0);} else {convert += word;}}return convert;}

4.LanguageUtil 语言工具类

 /*** 遍历,把languages数据封装,并且把首字母提取出来* @param languages* @param lang 要删除掉的数据* @return*/public List<LanguageInfo> extractList(Language[] languages,Language lang){List<LanguageInfo> list = new ArrayList<>();//添加去重的语言字母for(String str:extractLetter(languages)){LanguageInfo languageInfo = new LanguageInfo();languageInfo.setType(1);languageInfo.setName(str);list.add(languageInfo);}//把Language封装成LanguageInfo并且获取首字母for(Language language : languages){if(lang!=null) {//如果和lang相同,则不添加到list里面if (lang.getLanguage().equals(language.getLanguage())) {continue;}}LanguageInfo languageInfo = new LanguageInfo();languageInfo.setType(0);languageInfo.setLanguage(language);languageInfo.setName(PinyinUtil.getPinYinFristHeadChar(language.getLanguage()).toUpperCase());list.add(languageInfo);}return list;}/*** 获取每种语言的首字母,去重* @param languages* @return*/public HashSet<String> extractLetter(Language[] languages){HashSet<String> set = new HashSet<>();for (Language language:languages) {String lhsSortLetters = PinyinUtil.getPinYinFristHeadChar(language.getLanguage()).toUpperCase();set.add(lhsSortLetters);}return set;}

5.在Activity调用

 //安首字母排序List<LanguageInfo> languageInfos = LanguageUtil.getInstance().extractList(languages,toLang);//按首字母排序Collections.sort(languageInfos, new LetterComparator());List<LanguageInfo> lis = getSpLanguageInfo();list.addAll(lis);list.addAll(languageInfos);/*** 从sp中获取常用语言数据列表* @return*/private List<LanguageInfo> getSpLanguageInfo(){List<LanguageInfo> languageInfos = new ArrayList<>();String data = "";//从sp中获取常用语言列表信息if(type == LANGUAGE_FROMADAPTER){data = SpUtils.getInstance().getString(MyConfig.SP_FROMLANG_LIST);}else{data = SpUtils.getInstance().getString(MyConfig.SP_TOLANG_LIST);}if("".equals(data)){return languageInfos;}List<Language> languages = JSON.parseArray(data,Language.class);LanguageInfo languageInfo = new LanguageInfo();languageInfo.setType(1);languageInfo.setName("#");languageInfos.add(languageInfo);for(int i = languages.size()-1;i>=0;i--){Language language = languages.get(i);LanguageInfo li = new LanguageInfo();li.setType(0);li.setName("#");li.setLanguage(language);languageInfos.add(li);}return languageInfos;}...
public class LetterComparator implements Comparator<LanguageInfo> {@Overridepublic int compare(LanguageInfo l, LanguageInfo r) {if (l == null || r == null) {return 0;}String lhsSortLetters = PinyinUtil.getPinYinHeadChar(l.getName()).toUpperCase();String rhsSortLetters = PinyinUtil.getPinYinHeadChar(r.getName()).toUpperCase();if (lhsSortLetters == null || rhsSortLetters == null) {return 0;}return lhsSortLetters.compareTo(rhsSortLetters);}
}

6.监听

  //设置右边字母滑动时的事件mWavesidebar.setOnSelectIndexItemListener(new WaveSideBar.OnSelectIndexItemListener() {@Overridepublic void onSelectIndexItem(String index) {//获得滑动位置的字母在adapter里的位置int pos = adapter.getLetterPosition(index);if (pos != -1) {//跳转到对应的位置mRecyclerView.scrollToPosition(pos);LinearLayoutManager mLayoutManager =(LinearLayoutManager) mRecyclerView.getLayoutManager();mLayoutManager.scrollToPositionWithOffset(pos, 0);}}});

7.adapter

package com.geetol.translate.ui.adapter;import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import com.baidu.translate.asr.data.Language;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.geetol.translate.R;
import com.geetol.translate.models.LanguageInfo;import java.util.List;public class MyLanguageAdapter extends BaseQuickAdapter<LanguageInfo, BaseViewHolder>  {private Language language;public MyLanguageAdapter(int layoutResId, @Nullable List<LanguageInfo> data) {super(layoutResId, data);}public MyLanguageAdapter(@Nullable List<LanguageInfo> data) {//设置默认布局为语言布局super(R.layout.item_mylanguage_choose,data);}public MyLanguageAdapter(@Nullable List<LanguageInfo> data,Language language) {//设置默认布局为语言布局super(R.layout.item_mylanguage_choose,data);this.language = language;}@Overrideprotected void convert(BaseViewHolder helper, LanguageInfo item) {if(item.getType()==1){String name = item.getName();if("#".equals(name)){name = "常用语言";}//把字母添加到列表中((PinnedHolder)helper).languge_tip.setText(name);}else {helper.setText(R.id.language, item.getLanguage().getLanguage());helper.setVisible(R.id.language_speaker, item.getLanguage().isTtsAvailable());if(language!=null) {if (language.getLanguage().equals(item.getLanguage().getLanguage())) {helper.setTextColor(R.id.language, mContext.getResources().getColor(R.color.gre));}else{helper.addOnClickListener(R.id.language_item);}}else{helper.addOnClickListener(R.id.language_item);}}}//选择使用哪种布局@Overrideprotected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {if(viewType==1){//选择字母的布局文件return new PinnedHolder(getItemView(R.layout.item_mylanguage_char,parent));}//选择默认布局文件return super.onCreateDefViewHolder(parent, viewType);}/*** 找到字母在列表的位置* @param letter* @return*/public int getLetterPosition(String letter){for (int i = 0 ; i < getData().size(); i++){if(getData().get(i).getType() ==1 && getData().get(i).getName().equals(letter)){return i;}}return -1;}//返回的是onCreateDefViewHolder里的viewType@Overrideprotected int getDefItemViewType(int position) {return getItem(position).getType();}//首字母的ViewHolderclass PinnedHolder extends BaseViewHolder {TextView languge_tip;public PinnedHolder(View view) {super(view);languge_tip = view.findViewById(R.id.languge_tip);}}}

大致思路
1、WaveSideBar Demo里的json数据不符合项目的需求,如果想要一个符合项目需求的侧滑栏,我们需要重新写一个实体类来封装,但是核心的两个字段还是需要的(name\type)。name字段是需要显示到列表上数据的首字母(会根据这个字段排序)。type字段是为了区分类型(显示首字母/语言)。

2、adapter里的设置,RecyclerView有两种显示的layout,在adapter种的onCreateDefViewHolder方法里设置。当type字段里的值为0时,显示语言列表的layout。当type字段里的值为1时,显示字母的layout。

3、数据首字符获取,把获取到的List数据需要排序的字段用pinyin4j这个包获取到首字母,放到set集合里去重。把这些首字母添加到List集合的头部排序就可以得到字母+语言的列表。

首字母排序侧边索引栏:WaveSideBar的简单使用相关推荐

  1. android 仿微信联系人 首字母分组快速索引

    总结是一种习惯,不能停,一停人就懒了,都快一个月没有写了!该提提神了! 进入正题:android 仿微信联系人 首字母快速索引,先用下美团的索引效果图: 1.自定义View字母索引栏(右边那一列): ...

  2. [转载]ExtJS中grid按照中文拼音首字母排序、改变行背景、列背景、静态数据分页不再困难...

    代码 1 本示例主要使用到了静态数据分页 Ext.data.PagingMemoryProxy组件.Ext.PagingToolbar分页条.viewConfig的getRowClass 方法.列co ...

  3. 英文首字母排序mysql_利用MySQL数据库来处理中英文取首字母排序

    [package com.syz;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import ja ...

  4. Oracle 10g如何对用户姓名,按首字母排序、查询

    2019独角兽企业重金招聘Python工程师标准>>> 首先介绍Oracle 9i新增加的一个系统自带的排序函数 1.按首字母排序 在oracle9i中新增了按照拼音.部首.笔画排序 ...

  5. 中文按拼音首字母排序的C++实现方案

    先介绍下背景,最近有个需求,需要将用户的好友列表按照昵称的拼音首字母排序,类似于手机电话簿的联系人.一开始建议让终端同学去做这点,毕竟终端现有的电话簿模块已经实现了,不过终端同学说电话簿是系统组件,移 ...

  6. 按汉字首字母排序(sql语句)

    在sql server中可以直接通过SQL语句实现按汉字首字母排序,比如我们经常用到的"按姓名首字母排序" --把tableName和colName换成自己的就ok了 --按拼音 ...

  7. java pinyin4j 首字母_通讯录之按汉字首字母排序 --java--pinyin4J

    最近开发手机端OA系统通讯录时遇到了用汉字首字母排序的问题,各种谷歌后发现了一个轮子pinyin4J,这个轮子是可以将汉字转换成字母拼音,个人觉得很好用,完美的解决了排序的问题,分享一下. 一.工具介 ...

  8. Java 按照拼音首字母排序

    默认的 Collection.sort() 是按照 ASCII 码排序, 不过, 有第二个重载方法, 第二个参数可以传入 Comparator 对象 java.text.Collator 可以用于本地 ...

  9. MySQL中文无法按照拼音首字母排序解决方法convert(name USING gbk)

    问题如下: 使用默认的order by函数无法对中文数据按照首字母进行排序 SELECT * FROM `test_table` ORDER BY company_name,reply_room_na ...

最新文章

  1. Swift学习: 从Objective-C到Swift
  2. [Nginx] Nginx 配置location总结
  3. 【Python】全网最新最全Pyecharts可视化教程(二):绘制好看的交互式地图教程
  4. 去掉input、textarea 的边框
  5. MacBook Pro 2017 13寸版 触摸板windows驱动开发(开发HID鼠标键盘驱动之一)
  6. linux 一些好用的软件
  7. 寻址方式(立即寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址)
  8. Cognos函数(六) - total的使用
  9. Python爬虫简介
  10. 网络邻居没有查看工作组计算机,解决Windows 10 系统看不到网上邻居工作组里的其他计算机-win7网上邻居...
  11. *TEST 3 for NOIP 哈希有毒
  12. vue实现九宫格抽奖
  13. 比特鹏哥第二节课笔记
  14. 如何删除WhatsApp消息
  15. mysql查询名字相同数据排列出来_mysql 的sql语句来查找重复数据,并让其都显示出来?...
  16. 判断bug属于前端还是后端
  17. Adobe After Effects CC 2020 中英文语言切换方法
  18. Android 8.1 允许安装未知来源权限/允许来自此来源的应用
  19. matlab幂函数e,MATLAB e的幂函数拟合
  20. 从郭靖夫妇之死想到的(转载

热门文章

  1. fafa什么意思_Fafa是什么意思
  2. Linux学习——文件权限及文件查找
  3. 传智播客_急先锋_html、css、js_郝强勇老师
  4. python一个对象只能被一个变量引用吗_python中的对象、变量、引用的问题
  5. 史上最全RabbitMq详解
  6. 计算机桌面显示器,屏幕分辨率
  7. Tableau 八、数据分层、数据分组、数据集
  8. 打不开计算机 在任务栏里显示,电脑下方的任务栏不显示怎么办 电脑任务栏不显示解决方法【图文】...
  9. 西门子S7通信协议中TSAP的确认
  10. HA RabbitMQ on K8s helm部署实战