在刚学习Android的时候就想自己手写一个索引,但是当时还是彩笔,就一直没做,昨天写了一个索引,今天贴出来,以备后用,先上图:

由于列表是我自己封装的,可能必看到展示页面的时候会有陌生感,但是并不复杂,很好理解,好了不废话了,操起键盘就是干。

自定义索引栏:

注释加的已经很清楚了,还是不理解的@我

package app.project.view;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;import app.project.R;/*** @author qly*/
public class MySlideBar extends View {// 是否点击private boolean showBkg = false;// 监听面板是否点击接口OnTouchingLetterChangedListener onTouchingLetterChangedListener;// 26个字母public static String[] b = { "#", "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" };// 选择的值int choose = -1;private Context context;// 画笔Paint paint = new Paint();public MySlideBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context = context;}public MySlideBar(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;}public MySlideBar(Context context) {super(context);this.context = context;}/*** 重写这个方法*/protected void onDraw(Canvas canvas) {super.onDraw(canvas);//背景色绘制为灰色if (showBkg) {canvas.drawColor(Color.parseColor("#40000000"));}int height = getHeight();int width = getWidth();int singleHeight = height / b.length;for (int i = 0; i < b.length; i++) {paint.setAntiAlias(true);paint.setTextSize(context.getResources().getDimensionPixelSize(R.dimen.sidebar_textsize));// 点击的字体和26个字母中的任意一个相等就if (i == choose) {paint.setColor(Color.parseColor("#3399ff"));paint.setFakeBoldText(true);}// 字体的X坐标float xPos = width / 2 - paint.measureText(b[i]) / 2;// 字体的Y坐标float yPos = singleHeight * i + singleHeight;canvas.drawText(b[i], xPos, yPos, paint);// 还原画布paint.reset();}}/*** 点击事件*/@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {// 点击的Y坐标final float y = event.getY();final int oldChoose = choose;// 得到当前的值(当前点击坐标/控件高度*27)final int c = (int) (y / getHeight() * b.length);// 根据点击的状态不同做出不同的处理switch (event.getAction()) {// 按下已经开始case MotionEvent.ACTION_DOWN:// 将开关设置为trueshowBkg = true;if (oldChoose != c && onTouchingLetterChangedListener != null) {if (c >= 0 && c < b.length) {// 当当前点击的值绑定监听// 这个监听在本页面中做的是接口。实际调用是在MainActiv中。也就是说我们调用这个接口会执行MainActivtiy的方法onTouchingLetterChangedListener.onTouchingLetterChanged(b[c]);choose = c;// 刷新界面invalidate();}}break;// 松开为完成点击case MotionEvent.ACTION_MOVE:if (oldChoose != c && onTouchingLetterChangedListener != null) {if (c >= 0 && c < b.length) {onTouchingLetterChangedListener.onTouchingLetterChanged(b[c]);choose = c;invalidate();}}break;// 完成松开 还原数据 并刷新界面case MotionEvent.ACTION_UP:showBkg = false;choose = -1;invalidate();break;}return true;}/*** 向外公开的方法*/public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;}/*** 接口*/public interface OnTouchingLetterChangedListener {void onTouchingLetterChanged(String s);}}

列表展示页面

package app.project;import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import app.project.recycler.DevBaseRecyclerViewActivity;
import app.project.recycler.ListBaseRecyclerAdapter;
import app.project.utils.BaseStickyBean;
import app.project.model.ContactHeader;
import app.project.model.ItemsEntity;
import app.project.view.MySlideBar;public class IndexActivity extends DevBaseRecyclerViewActivity<BaseStickyBean> {List<ItemsEntity> list=new ArrayList<>();@Overridepublic void setContentView(@LayoutRes int layoutResID) {super.setContentView(R.layout.activity_index);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MySlideBar mySideBar= (MySlideBar) findViewById(R.id.my_side_bar);mySideBar.setOnTouchingLetterChangedListener(new MySlideBar.OnTouchingLetterChangedListener() {@Overridepublic void onTouchingLetterChanged(String s) {for (int i = 1; i < mList.size(); i++) {if (mList.get(i).getStickItem().equalsIgnoreCase(s)) {mRecyclerView.scrollToPosition(i);}}}});}@Overridepublic void loadData() {enableSwipeRefresh(false);list.add(new ItemsEntity("阿文"));list.add(new ItemsEntity("Andy"));list.add(new ItemsEntity("梁朝伟"));list.add(new ItemsEntity("周杰伦"));list.add(new ItemsEntity("蔡依林"));list.add(new ItemsEntity("陈慧琳"));list.add(new ItemsEntity("房祖名"));list.add(new ItemsEntity("罗启新"));list.add(new ItemsEntity("陈浩民"));list.add(new ItemsEntity("苏友朋"));list.add(new ItemsEntity("胡彦斌"));list.add(new ItemsEntity("叶德娴"));list.add(new ItemsEntity("孙燕姿"));list.add(new ItemsEntity("欧阳震华"));list.add(new ItemsEntity("郭富城"));list.add(new ItemsEntity("麦兆辉"));list.add(new ItemsEntity("向海岚 "));sortList(list);}public void sortList(List<ItemsEntity> list) {Map<String, List<ItemsEntity>> map = new HashMap<>();for (int i = 0; i < list.size(); i++) {ItemsEntity myContact  = list.get(i);List<ItemsEntity> temp = map.get(myContact.getStickItem());if (temp == null) {temp = new ArrayList<>();map.put(myContact.getStickItem(), temp);}temp.add(myContact);}List<BaseStickyBean> finalList = new ArrayList<>();List<String> keys = new ArrayList<>(map.keySet());Collections.sort(keys);for (int i = 0; i < keys.size(); i++) {finalList.add(new ContactHeader(keys.get(i)));finalList.addAll(map.get(keys.get(i)));}mList.addAll(finalList);setListAdapter();}@Overridepublic void onItemClick(ListBaseRecyclerAdapter.YFViewHolder holder, BaseStickyBean o, int position, long id) {}@Overridepublic View getView(ViewGroup parent, int viewType) {View view=LayoutInflater.from(this).inflate(R.layout.item,parent,false);if(viewType==0){return view;}else if(viewType==1){view.setBackgroundColor(Color.parseColor("#CDD7E2"));return view;}return null;}@Overridepublic void convertObject2View(ListBaseRecyclerAdapter.YFViewHolder holder, int position) {if(holder.getItemViewType()==1){holder.setText(R.id.tv, mList.get(position).getStickItem());}else if(holder.getItemViewType()==0){ItemsEntity item= (ItemsEntity) mList.get(position);holder.setText(R.id.tv,item.getName() );}}@Overridepublic int getItemViewType(int position) {BaseStickyBean bean = mList.get(position);if (bean instanceof ContactHeader) {return 1;}return 0;}}

数据排序的实现

  1. 新建一个map用来存储索引开头字母和姓名类似:map<字母 姓名>
  2. 我们遍历数据集合并且取出姓名首字母,然后新建集合放入字母对应的名字map
  3. 按字母排序Collections.sort(keys);,让后按照字母遍历分组排序。这样就搞定了

怎么获取的姓名首字母的呢?

我们使用了一个jar包,pinyin4j-2.5.0.jar就是它。有兴趣的可以看下。 需要源码@我

Android 索引的实现相关推荐

  1. android 索引怎么使用情况,android 數據庫查詢中使用索引-大幅提高數據庫操作速度...

    參考: http://blog.csdn.net/dongyuxi1987/article/details/8239739 1.數據庫索引簡介 回憶一下小時候查字典的步驟,索引和字典目錄的概念是一致的 ...

  2. Android Studio官方文档之添加URL和App索引支持

    Android Studio官方文档之添加URL和App索引支持 本文由nyk翻译,jkYishon审校. Android Studio可以帮你在App中添加对URLs,app索引,搜索功能的支持.这 ...

  3. 玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  4. android a z 快速定位,快速集成android实现listview的字母A-Z排序,界面侧边字母索引...

    Android手机字母A-Z排序侧边索引是非常常见的功能,在此提供快速集成框架.教你用Android studio工具一分钟搞定这个效果. 实现效果: 以及点击F跳转效果 第一步库包导入实现拼音检索功 ...

  5. android字符串获取数字索引,从字符串中提取特定数据(Extract specific data from a string)...

    从字符串中提取特定数据(Extract specific data from a string) 我有一个带有描述的长字符串. 我想从字符串中提取一些信息. 但我无法弄明白该怎么做. 这是字符串: C ...

  6. 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )

    文章目录 一.Android 10 以前的存储机制 二.Android 10 及以后的分区存储机制 三.Android 10 中的存储过渡方案 四.文件索引数据库 五.相关文档资料 一.Android ...

  7. Android复习07【创建数据库、insert()插入数据、查看数据库、根据列索引获取参数值、根据列名-返回索引、增删改查数据、数据分页、修改表结构、Room框架】

    2020-04-09-星期四-第八周 目   录 创建数据库 insert()方法 查看数据库(Save as保存) 菜鸟教程---SQLite数据库 根据 列索引 获取 参数值 列比较多---根据列 ...

  8. Android App列表之游标ListView(索引ListView)

    原帖地址:http://www.apkbus.com/android-14717-1-1.html 游标ListView,提供索引标签,使用户能够快速定位列表项.       也可以叫索引ListVi ...

  9. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.       也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.       一看图啥都懂了: ...

  10. Android 3D 编程:索引

    3D编程对于移动应用开发的重要性,不需要多叽歪了--看看愤怒的小鸟有多火就知道了 Android提供了OpenGL ES的Java API:NDK也提供了对OpenGL ES的支持,从Android ...

最新文章

  1. SQLite安装、编译与应用
  2. Linux中查看正在使用的端口并强制删除占用端口
  3. CentOS 初体验四: 阿里云服务器开启8080端口
  4. opencv+yolov3实现目标检测
  5. boost::callable_traits的has_varargs的测试程序
  6. macbook配置java环境变量_Mac系统配置JDK环境变量
  7. 运行QQ出现initialization failure 0x0000000c错误和浏览器上不了网
  8. 前端学习(2211):网络请求模块的选择--axios的配置相关
  9. jquery ajax 解决跨域访问问题
  10. Coolite动态加载CheckboxGroup,无法在后台中获取
  11. java声明一个函数_java – 如何声明一个函数参数来接受抛出的函数?
  12. 问题 F: 编写函数:一维数组的逆序 (Append Code)
  13. 通过对极几何求解相机运动
  14. LeetCode_9_回文数字
  15. Ucinet6 + Netdraw 根据excel文件绘制网络拓扑图
  16. 汉字编码及区位码查询算法
  17. 道德经和译文_道德经——老子道德经全文及译文
  18. 计算机机房的网络属于,学校机房的网络属于()。
  19. 推荐综述博客网址马克
  20. 【工具】动图展示 60+ 个前端常用插件库合集

热门文章

  1. html5理财计算,理财产品的收益怎么算(个人理财收益计算器)
  2. 使用adb指令往机顶盒上安装应用
  3. 鼠标控制c语言扫雷程序,【源码项目】C语言/C+开发,打造一个小项目扫雷小游戏!...
  4. POI设置excel格式为文本格式
  5. 为互联网IT人打造的中文版awesome-go
  6. Firefox插件Xmarks的使用方法
  7. 格力如失去经销商支持,或将进一步落后于美的,董明珠慌了么?
  8. Mex HDU - 4747(递推, 思维)
  9. 银河英雄传说旗舰名称考证—帝国军
  10. 如何给公司节约成本,搭建免费开源监控系统uptime-kuma