Android手机字母A-Z排序侧边索引是非常常见的功能,在此提供快速集成框架.教你用Android studio工具一分钟搞定这个效果.

实现效果:

以及点击F跳转效果

第一步库包导入实现拼音检索功能

-------拼音检索详细见:

compile 'com.github.promeg:tinypinyin:1.0.0'// ~80KB同步后后面会下载80k的文件,就可以使用

-------测试一下:

public void go1(View view){//按钮go1点击测试

String str="界面侧边ABc字母检索";

for (char c:str.toCharArray()){

System.out.println("检索返回:"+Pinyin.toPinyin(c));//如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c)

System.out.println("如果c为汉字,则返回true,否则返回false:"+Pinyin.isChinese(c));

}

}

结果效果:

第二步构建代码:

1.适配器LvRithtItemAdapter类

public class LvRightItemAdapter extends BaseAdapter { private List mEntities; private Activity context; private LayoutInflater layoutInflater; public LvRightItemAdapter(Activity context,List entities) { this.context = context; this.mEntities = entities; this.layoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return mEntities.size(); } @Override public DataEntity getItem(int position) { return mEntities.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = layoutInflater.inflate(R.layout.lv_right_item, parent,false); ViewHolder viewHolder = new ViewHolder(); viewHolder.tvLvRightItem = (TextView) convertView.findViewById(R.id.tv_lv_right_item); convertView.setTag(viewHolder); } initializeViews((DataEntity)getItem(position), (ViewHolder) convertView.getTag()); return convertView; } private void initializeViews(DataEntity entity, ViewHolder holder) { //TODO implement holder.tvLvRightItem.setText(String.valueOf(entity.getChar_First())); } protected class ViewHolder { private TextView tvLvRightItem; } }

2.自定义MyExpandAdapter代码(这个类只是把没用到的ExpandableListAdapter复写方法存放在这):

public abstract class MyExpandAdapter implements ExpandableListAdapter{ //用抽象方法把下拉子菜单的不用的方法集中在这里,方便观看 //抽象出接口,回调方法,用方法继承就可以定义子菜单 @Override public void registerDataSetObserver(DataSetObserver observer) { } @Override public void unregisterDataSetObserver(DataSetObserver observer) { } @Override public Object getGroup(int groupPosition) { return null; } @Override public Object getChild(int groupPosition, int childPosition) { return null; } @Override public long getGroupId(int groupPosition) { return 0; } @Override public long getChildId(int groupPosition, int childPosition) { return 0; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEmpty() { return false; } @Override public void onGroupExpanded(int groupPosition) { } @Override public void onGroupCollapsed(int groupPosition) { } @Override public long getCombinedChildId(long groupId, long childId) { return 0; } @Override public long getCombinedGroupId(long groupId) { return 0; } }

3.精简的下拉子菜单自定义SimpleExpAdapter适配器类

public class SimpleExpAdapter extends MyExpandAdapter{

private List mDataEntities; //列表数据存放的集合

private Activity mActivity;

private LayoutInflater mLayoutInflater; //布局渲染成一个view

public SimpleExpAdapter(List dataEntities, Activity activity){

mDataEntities = dataEntities;

mActivity = activity;

mLayoutInflater=mActivity.getLayoutInflater();

}

@Override

public int getGroupCount() {

return mDataEntities.size();

}

@Override

public int getChildrenCount(int groupPosition) {

return mDataEntities.get(groupPosition).getDatas().size();

}

@Override

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

ViewHolder viewHolder=null;

if (convertView==null){

viewHolder=new ViewHolder();

convertView=mLayoutInflater.inflate(R.layout.exlv_item_group,parent,false);

viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tv_exlv_group);

convertView.setTag(viewHolder);

}else {

viewHolder= (ViewHolder) convertView.getTag();

}

viewHolder.mTextView.setText(String.valueOf(mDataEntities.get(groupPosition).getChar_First()));//适配器设置列表数据

return convertView;

}

@Override

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

ViewHolder viewHolder=null;

if (convertView==null){

viewHolder=new ViewHolder();

convertView=mLayoutInflater.inflate(R.layout.exlv_item_child,parent,false);

viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tv_exlv_child);

convertView.setTag(viewHolder);

}else{

viewHolder= (ViewHolder) convertView.getTag();

}

viewHolder.mTextView.setText(mDataEntities.get(groupPosition).getDatas().get(childPosition));

return convertView;

}

class ViewHolder{//item放置的控件

TextView mTextView;

}

}

4.数据逻辑控制dao包:

public class DataDao { private List mDataEntities=new ArrayList<>(); public void add(String data){ char data_first=data.toUpperCase().charAt(0); //将首个字母转换为大写字母 if (Pinyin.isChinese(data_first)){ //如果首个字母是中文,则获取汉字首个字母的大写 data_first= Pinyin.toPinyin(data_first).charAt(0); } //确保取得大写的唯一首字母,然后继续执行 for (DataEntity dataEntity:mDataEntities){ if (dataEntity.isSameFirst(data_first)){ dataEntity.addData(data); return; } } DataEntity dataEntity=new DataEntity(); dataEntity.setChar_First(data_first); dataEntity.addData(data); mDataEntities.add(dataEntity); Collections.sort(mDataEntities); } public List getDataEntities() { System.out.println(mDataEntities.toString()); return mDataEntities; } }

5.封装列表数据类:

public class DataEntity implements Comparable{

private char mChar_First; //定义首字母

private List mDatas=new ArrayList<>();

public boolean isSameFirst(char des){//判断是否与传入的des相等

return des==this.mChar_First;

}

public void addData(String data){

mDatas.add(data);

Collections.sort(mDatas); //排列首字母相同的列表数据

System.out.println(mDatas.toString());

}

@Override

public int compareTo(DataEntity another) {

return this.mChar_First-another.getChar_First();

}

public List getDatas() { //存放同首字母的列表数据

return mDatas;

}

public char getChar_First() {

return mChar_First;

}

public void setChar_First(char char_First) {

mChar_First = char_First;

}

@Override

public String toString() {

return "DataEntity{" +

"mChar_First=" + mChar_First +

", mDatas=" + mDatas +

'}';

}

}

6显示的activity界面类(数据直接在addlistdatas()方法中添加):

public class MainActivity extends AppCompatActivity {

ExpandableListView mExlv;

DataDao mDataDao=new DataDao();

ListView mLvRight; //右侧的字母栏

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

addListdatas();//填充列表假数据测试,失败经验:数据不能再setadapter之后进行

initListener();

}

public void initListener(){

mExlv.setAdapter(new SimpleExpAdapter(mDataDao.getDataEntities(), this));

//全都展开不能回缩

for (int i = 0; i < mDataDao.getDataEntities().size(); i++) {

mExlv.expandGroup(i);

}

mExlv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

@Override

public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

return true;

}

});

mLvRight.setAdapter(new LvRightItemAdapter(this,mDataDao.getDataEntities()));

mLvRight.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView parent, View view, int position, long id) {

mExlv.setSelectedGroup(position);

}

});

}

public void initView(){

mExlv= (ExpandableListView) findViewById(R.id.exlv);

mLvRight= (ListView) findViewById(R.id.lv_right);

}

// public void go1(View view){ //字母检索

// String str="界面侧边ABc字母检索";

// for (char c:str.toCharArray()){

// System.out.println("检索返回:"+Pinyin.toPinyin(c));//如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c)

// System.out.println("如果c为汉字,则返回true,否则返回false:"+Pinyin.isChinese(c));

// }

// }

public void addListdatas(){

mDataDao.add("拜拜这是b");

mDataDao.add("啊啊这是a");

mDataDao.add("啧啧这是z");

mDataDao.add("烦烦这是f");

mDataDao.add("哥哥这是g");

mDataDao.add("哈哈这是h");

mDataDao.add("看看这是k");

mDataDao.add("啊拜这是ab");

for(int i='a';i

if (i=='e'||i=='h'){

continue;

}

mDataDao.add((char) i + "1");

mDataDao.add((char) i + "2");

mDataDao.add((char) i + "3");

}

for (int i = 'A'; i <= 'Z'; i++) {

if (i == 'E' || i == 'H') {

continue;

}

mDataDao.add((char) i + "1");

mDataDao.add((char) i + "2");

mDataDao.add((char) i + "3");

}

}

第三步xml界面的构建:

1.activity界面的实现:

2.exlv_item_child自定义适配器布局(可以根据自己想法更改界面显示)

3.exlv_item_group自定义适配器布局(可以根据自己想法更改界面显示)

4.lv_right_item自定义listview适配器布局(可以根据自己想法更改界面显示)

最后原理总结:

-----原理解析

概括:字符串放入 集合 中进行排序

分层结构:

A: a开头名字数据 子菜单名字(字符串排序:Collections.sort(数据));

所有数据(如电话名字) B:b开头名字数据 子菜单名字(字符串排序:Collections.sort(数据));

C: c开头数据数据 子菜单名字(字符串排序:Collections.sort(数据));

.....

在ASll码表中字母大小写位置

-----------implement方法构建精简的下拉子菜单适配器.

注意:用抽象类的方法,让我们想要的适配器实现需要的复写的方法

--------列表数据形式:

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

  1. Android之高德地图定位SDK集成及地图功能实现

    一:百度高德官方网站,然后去创建应用. 网址:http://lbs.amap.com/ 1.找到控制台创建一个应用. 2.添加key名称,注意命名规范,还有就是下面的SHA1和包名. 3.点击右边的G ...

  2. uniapp android原生,在uni-app项目中集成Android原生工程

    [TOC] # 在uni-app项目中集成Android原生工程 按照官方的方案,我们如果进行本地打包的话,需要重新创建一个Android原生工程,于是就会导致我们管理多个项目,切来切去的也麻烦. 经 ...

  3. android实现3种定位的切换,Android 滑动定位+吸附悬停效果实现

    在前两篇文章中,分别介绍了tablayout+scrollview 和 tablayout+recyclerview 实现的滑动定位的功能,文章链接: Android 实现锚点定位 Android t ...

  4. android百度地图获取定位信息吗,android使用百度地圖定位(獲取當前經緯度和地址信息)...

    首先,當然是把需要用到的包導入到工程項目中.(沒有包的自己去百度API官網下載) 把 baidumapapi_v3_0_0.jar 和 locSDK_4.2.jar復制粘貼到項目的libs目錄下, 然 ...

  5. android 强制打开gps定位_Android 6.0动态权限及跳转GPS设置界面的方法

    1.动态权限申请 模糊的位置信息android.permission.ACCESS_COARSE_LOCATION权限为例 在AndroidManifest文件中加入权限 然后java代码中动态申请 ...

  6. 快速定位解决Android内存泄漏

    此文章来源于APP架构师这个公众号 今天的主题是Android开发中的内存泄漏,之所以说这个是因为前几天做了项目中的内存泄漏排查与解决,在这里总结一下,被提供一种快速定位解决Android内存泄漏的方 ...

  7. 如何快速集成Android版AGConnect认证服务-VK篇

    简介 大部分的应用都需要对用户的业务访问进行身份认证,以便为用户提供个性化体验.但是端到端完整构建一套用户认证系统会面临很多挑战.认证服务可以为应用快速构建安全可靠的用户认证系统,开发者只需在应用中访 ...

  8. 如何快速定位Android APP中的关键函数?

    需求来源 在逆向分析中,肯定是越快地定位到目标函数越好,那么有没有这样的一种工具可以快速地辅助分析人员定位到目标函数呢? 最早的一个想法是这样的: - 通过某种机制让APP输出函数调用时候的日志记录. ...

  9. Android(9) 环信sdk手动集成(非添加easeui依赖快速集成)

    @先看看效果是不是自己想要的吧@ 准备:参考官方文档,先注册并创建应用 (这里再分享一下利用easeui快速集成的方法吧   --->   https://blog.csdn.net/qq_38 ...

最新文章

  1. 理解计算机视觉中的损失函数
  2. Unity 4.x 2D游戏开发基础教程
  3. python的用途实例-python进程池作用展示及实例解析
  4. Boost:字符串Predicate的测试实例
  5. 算法设计与分析复习第一二章(时间复杂度和蛮力法)
  6. Docker Compose运行MySQL、Redis服务
  7. JVM调优之:垃圾收集器
  8. Hibernate之HQL查询
  9. 量子计算机前置同态加密技术,什么是具有抗量子计算机攻击潜质的全同态加密技术?...
  10. 供应链金融的产品业务系统应用架构设计
  11. 分号(;)和逗号(,)的用法
  12. “中年跳槽,伤筋动骨”:35岁跳槽,你可要想清楚
  13. Intel的Barefoot与AMD的Pensando技术
  14. 每个月3000结余,买余额宝好还是基金定投好?
  15. Cloudera Manager安装之利用parcels方式安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(四)...
  16. python提取图片文字
  17. ins是什么与Instagram有什么区别
  18. 啥是认知智能? 认知智能和人工智能到底有啥区别? 你知道吗? 道翰天琼认知智能。
  19. redis数据类型有哪些
  20. python 数组写txt_python txt文件常见读写操作

热门文章

  1. 小姐姐在硅谷生活了三年,实现了理想的生活模式
  2. ​每日一皮:​你的Frozen Throne...
  3. Windows 命令行终端 PowerShell 美化计划
  4. 如何使用Arthas定位线上 Dubbo 线程池满异常
  5. Spring Cloud Greenwich 最后一个计划版本发布!
  6. 开源高性能异步网关:Soul
  7. linux分区模型,linux设备驱动模型详解.pdf
  8. 【SpringCloud】Ribbon-实例
  9. “libc++_shared.so“ not found 解决
  10. opencv cuda使用笔记