联系人排序  侧边选择栏是第三方库sidebar 地址:https://github.com/kongnanlive/SideBar

adapter.java

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{private List<String> list;private List<String> listAll;public Adapter(List<String> list){this.list=list;listAll=new ArrayList<>();}public List<String> getListAll(){return listAll;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,null);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {holder.itemText.setText(list.get(position));}@Overridepublic int getItemCount() {return list.size();}class ViewHolder extends RecyclerView.ViewHolder{private TextView itemText;public ViewHolder(View itemView) {super(itemView);itemText= (TextView) itemView.findViewById(R.id.item_text);}}}
MainActivity.java
public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;private Adapter adapter;private SideBar sideBar;private List<String> list,listPinY,listAll;private LinearLayoutManager linearLayoutManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String string="汉字,汉语的书写用文字 ,也被借用于书写日语、朝鲜语/韩语等语言。中国的通用文字和唯一官方文字,也是新加坡的官方文字之一,目前确切历史可以追溯到商朝的甲骨文。在日本语中与平假名、片假名混合使用。汉字也曾经是李氏朝鲜的官方文字之一(15世纪朝鲜世宗国王发明谚文,亦称朝鲜文/韩文),目前韩国只在需要汉字标记以避免词义不明的情况下使用,朝鲜则全部采用谚文拼写。汉字亦称中文字、中国字、国字,属于表意文字的词素音节文字,由汉族发明并改进,是世界上最古老的四大自源文字(两河流域的楔形文字、古埃及的圣书字、中国商朝甲骨文、玛雅文字)之一,亦是其中唯一沿用至今的文字。汉字是世界历史上连续使用时间最长的文字,中国历代皆以汉字为主要官方文字。隶变是汉字发展史上的一个里程碑,汉字发展至汉朝隶书时被取名为“汉字”。汉字的演变过程是:史前符号,商朝的甲骨文,周代的金文、大篆,秦朝的小篆、籀文,汉代的隶书,唐代的楷书(今日所用的手写字体标准),草书,行书。";list=new ArrayList<>();//保存字符listPinY=new ArrayList<>();//保存字符的索引字母listAll=new ArrayList<>();//保存索引字母和字符for(int i=0;i<string.length()/5;i++){list.add(string.substring(i*5,(i+1)*5));}Collections.sort(list, new Comparator<String>() {public int compare(String arg0, String arg1) {//根据字符的拼音排序return PinyinHelper.getShortPinyin(arg0).compareTo(PinyinHelper.getShortPinyin(arg1));}});for(int i=0;i<list.size();i++){//将文字和索引字母保存起来String str=list.get(i);if(i==0){//list第一个肯定有索引字母,将索引字母和文字都放入listAll中String py=PinyinHelper.getShortPinyin(str).substring(0,1);listAll.add(py);listAll.add(list.get(i));listPinY.add(py);//索引字母存入listPinY}else if(i!=0&&!(PinyinHelper.getShortPinyin(str).substring(0,1).equals(PinyinHelper.getShortPinyin(list.get(i-1)).substring(0,1)))){//当list不是第一个时并且当前字符拼音首字母与前一个字符的拼音首字母不相等//则依次将索引字母与字符存入listAllString py=PinyinHelper.getShortPinyin(str).substring(0,1);listAll.add(py);listAll.add(list.get(i));listPinY.add(py);//存入索引字母}else {listAll.add(list.get(i));}}recyclerView= (RecyclerView) findViewById(R.id.recycler);linearLayoutManager=new LinearLayoutManager(this);recyclerView.setLayoutManager(linearLayoutManager);recyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL));adapter=new Adapter(listAll);recyclerView.setAdapter(adapter);sideBar= (SideBar) findViewById(R.id.sidebar);String[] strings=new String[listPinY.size()];//拼音数组 sidebar用到for(int i=0;i<listPinY.size();i++){strings[i]=listPinY.get(i);}sideBar.setLetters(strings);sideBar.setOnTouchingLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {@Overridepublic void onTouchingLetterChanged(String s) {linearLayoutManager.scrollToPositionWithOffset(listAll.indexOf(s),0);}});}}
当最后使recyclerview滚动到指定位置时,发现了一个问题,使用
recyclerView.smoothScrollToPosition(position);
recyclerView.scrollToPosition(position);
均不能准确的移动到指定位置。当要移动的位置处于屏幕外部的上方时,移动后该位置处于第一行;当要移动的位置处于屏幕外部的下方时,移动后该位置处于最后一行;当要移动的位置处于屏幕内时,recyclerview不移动。
所以,最后用
linearLayoutManager.scrollToPositionWithOffset(int position, int offset);
position表示使该item处于第一行,offset表示该item距recyclerview顶部的像素大小。

代码下载:http://download.csdn.net/detail/u014290233/9587868

RecyclerView 联系人排序相关推荐

  1. 关于iphone、QQ通讯录、飞聊联系人排序设计的思考

    目前,对于联系人的排序,如果不考虑对方的在线状态,一般都是按照音序排序的.所谓音序排序,也就是拼音字母的顺序:首先是按照整个拼音的首字母(26个字母从A~Z)的顺序排列,如果首字母相同,则依次按照声母 ...

  2. android 联系人 中文 排序,Android中文联系人排序及检索补丁的原理

    Android中文联系人排序及检索补丁的原理(090819更新) 2009年4月26日,更新了源码和相关文件 很久以前做了这个补丁,有幸的是朋友们都还算喜爱它,没白费功夫.不少朋友来信问它的原理,现在 ...

  3. 联系人排序java代码_Android仿微信联系人按字母排序_脚本之家

    App只要涉及到联系人的界面,几乎都是按照字母排序以及导航栏的方式.既然这个需求这么火,于是开始学习相关内容,此篇文章是我通过参考网上资料独立编写和总结的,希望多多少少对大家有所帮助,写的不好,还请各 ...

  4. 联系人排序java代码_Android仿微信联系人按字母排序

    App只要涉及到联系人的界面,几乎都是按照字母排序以及导航栏的方式.既然这个需求这么火,于是开始学习相关内容,此篇文章是我通过参考网上资料独立编写和总结的,希望多多少少对大家有所帮助,写的不好,还请各 ...

  5. Android中文联系人排序及检索补丁的原理(090819更新)

    原文转自孙志岗老师Sunner的博客:http://blog.sunner.cn/2009/04/android_pinyin_sorting/ 文章写的是针对Android1.0, 1.1及1.5( ...

  6. 【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )

    文章目录 一.ItemTouchHelper 简介 二.RecyclerView 相关资料 一.ItemTouchHelper 简介 官方文档 : https://developer.android. ...

  7. java 中文联系人排序_通讯录之按汉字首字母排序-java

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

  8. Android 使用RecyclerView实现(仿微信)的联系人A-Z字母排序和过滤搜索功能

    之前做项目的时候遇到一个需求是实现品牌的字母排序功能,网上的资料很多,但是有一部分有bug,这篇文章是我学习和解决部分bug之后的总结.今天带来的是RecyclerView的A-Z字母排序和过滤搜索功 ...

  9. android t9搜索算法,T9拨号盘搜索和排序算法

    T9拨号盘搜索和排序算法 一. 背景 今日头条为何能突破bat的壁垒,很大程度在于它精确的推荐算法, 能够根据用户的喜爱推荐适合用户的资讯,不断根据用户的浏览记录构建用户的偏好生态圈,进而精准投放流量 ...

最新文章

  1. 【物料钢卷识别与定位】:1.读取数据(获取原始数据)
  2. 2020下半年新机最新消息_2020年下半年即将发布的手机,你们期待吗
  3. linux——使用fidsk对linux硬盘进行操作【转】
  4. Golang gin框架:发送GET POST PUT DELETE请求
  5. 我的选车经历--学习比经验更重要
  6. oracle数据库IMP-00010错误解决
  7. SQL Server 2016 SP1中的新功能和增强功能
  8. 计算机文化基础第二次答案,中国石油大学2020年秋计算机文化基础第二次在线作业答案...
  9. VS C++ 字符串分割 strtok
  10. Atitit需求文档模板大纲目录 attilax总结
  11. Pod install 慢, pod update 慢, Cocoapods setup下载缓慢,手动解决方案
  12. 使用卡尔曼滤波器进行回声消除
  13. [em] [/em] 表情 代码 如何使用 qq空间代码
  14. O、Θ、Ω、o、ω,别再傻傻分不清了!
  15. 关于移动应用用户体验设计的一些体会
  16. 教程篇(6.4) 02. FortiOS架构 ❀ 企业防火墙 ❀ Fortinet 网络安全架构师 NSE7
  17. vue前端实现从数据库获取数据的下拉框以及带参请求
  18. 学计算机进富士康,大学生进富士康上班工资多高,有发展前景吗?看看前辈们怎么说...
  19. 【花雕动手做】有趣好玩的音乐可视化系列项目(28)--LED乒乓球灯
  20. java极光推送实例

热门文章

  1. oracle中inner left right full 的使用
  2. Oracle-記一下使用full join的坑
  3. 作为代理记账公司的销售,该如何与客户交流,才能赢得客户的好感?
  4. mysql limit 运算符_MYSQL LIMIT 用法
  5. Java基础——数据导入(Scanner)
  6. EHR人力资源项目总结
  7. java和c++的区别_JAVA和C++区别详解
  8. 利用Python实现绘制3D爱心的代码分享
  9. 最短路(Dijkstra)
  10. Python学习:关键字global和nonlocal的用法说明