我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android手机联系人带字母索引的快速查找

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android手机联系人带字母索引的快速查找

喜欢另辟蹊径的我,在这里废话不多说了,直接上代码和图片了。
效果图如下:

第一步:MainActivity的代码如下:


package net.loonggg.test; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.TreeSet; 
import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Color; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.Window; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.LinearLayout.LayoutParams; 
public class MainActivity extends Activity { 
  private HashMap<String, Integer> selector;// 存放含有索引字母的位置 
  private LinearLayout layoutIndex; 
  private ListView listView; 
  private TextView tv_show; 
  private ListViewAdapter adapter; 
  private String[] indexStr = { "#", "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" }; 
  private List<Person> persons = null; 
  private List<Person> newPersons = new ArrayList<Person>(); 
  private int height;// 字体高度 
  private boolean flag = false; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // 去标题栏 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main); 
    layoutIndex = (LinearLayout) this.findViewById(R.id.layout); 
    layoutIndex.setBackgroundColor(Color.parseColor("#00ffffff")); 
    listView = (ListView) findViewById(R.id.listView); 
    tv_show = (TextView) findViewById(R.id.tv); 
    tv_show.setVisibility(View.GONE); 
    setData(); 
    String[] allNames = sortIndex(persons); 
    sortList(allNames); 
    selector = new HashMap<String, Integer>(); 
    for (int j = 0; j < indexStr.length; j++) {// 循环字母表,找出newPersons中对应字母的位置 
      for (int i = 0; i < newPersons.size(); i++) { 
        if (newPersons.get(i).getName().equals(indexStr[j])) { 
          selector.put(indexStr[j], i); 
        } 
      } 
    } 
    adapter = new ListViewAdapter(this, newPersons); 
    listView.setAdapter(adapter); 
  } 
   
  private void sortList(String[] allNames) { 
    for (int i = 0; i < allNames.length; i++) { 
      if (allNames[i].length() != 1) { 
        for (int j = 0; j < persons.size(); j++) { 
          if (allNames[i].equals(persons.get(j).getPinYinName())) { 
            Person p = new Person(persons.get(j).getName(), persons 
                .get(j).getPinYinName()); 
            newPersons.add(p); 
          } 
        } 
      } else { 
        newPersons.add(new Person(allNames[i])); 
      } 
    } 
  } 
  @Override 
  public void onWindowFocusChanged(boolean hasFocus) { 
    // 在oncreate里面执行下面的代码没反应,因为oncreate里面得到的getHeight=0 
    if (!flag) {// 这里为什么要设置个flag进行标记,我这里不先告诉你们,请读者研究,因为这对你们以后的开发有好处 
      height = layoutIndex.getMeasuredHeight() / indexStr.length; 
      getIndexView(); 
      flag = true; 
    } 
  } 
   
  public String[] sortIndex(List<Person> persons) { 
    TreeSet<String> set = new TreeSet<String>(); 
    // 获取初始化数据源中的首字母,添加到set中 
    for (Person person : persons) { 
      set.add(StringHelper.getPinYinHeadChar(person.getName()).substring( 
          0, 1)); 
    } 
    // 新数组的长度为原数据加上set的大小 
    String[] names = new String[persons.size() + set.size()]; 
    int i = 0; 
    for (String string : set) { 
      names[i] = string; 
      i++; 
    } 
    String[] pinYinNames = new String[persons.size()]; 
    for (int j = 0; j < persons.size(); j++) { 
      persons.get(j).setPinYinName( 
          StringHelper 
              .getPingYin(persons.get(j).getName().toString())); 
      pinYinNames[j] = StringHelper.getPingYin(persons.get(j).getName() 
          .toString()); 
    } 
    // 将原数据拷贝到新数据中 
    System.arraycopy(pinYinNames, 0, names, set.size(), pinYinNames.length); 
    // 自动按照首字母排序 
    Arrays.sort(names, String.CASE_INSENSITIVE_ORDER); 
    return names; 
  } 
   
  public void getIndexView() { 
    LinearLayout.LayoutParams params = new LayoutParams( 
        LayoutParams.WRAP_CONTENT, height); 
    for (int i = 0; i < indexStr.length; i++) { 
      final TextView tv = new TextView(this); 
      tv.setLayoutParams(params); 
      tv.setText(indexStr[i]); 
      tv.setPadding(10, 0, 10, 0); 
      layoutIndex.addView(tv); 
      layoutIndex.setOnTouchListener(new OnTouchListener() { 
        @Override 
        public boolean onTouch(View v, MotionEvent event) 
        { 
          float y = event.getY(); 
          int index = (int) (y / height); 
          if (index > -1 && index < indexStr.length) {// 防止越界 
            String key = indexStr[index]; 
            if (selector.containsKey(key)) { 
              int pos = selector.get(key); 
              if (listView.getHeaderViewsCount() > 0) {// 防止ListView有标题栏,本例中没有。 
                listView.setSelectionFromTop( 
                    pos + listView.getHeaderViewsCount(), 0); 
              } else { 
                listView.setSelectionFromTop(pos, 0);// 滑动到第一项 
              } 
              tv_show.setVisibility(View.VISIBLE); 
              tv_show.setText(indexStr[index]); 
            } 
          } 
          switch (event.getAction()) { 
          case MotionEvent.ACTION_DOWN: 
            layoutIndex.setBackgroundColor(Color 
                .parseColor("#606060")); 
            break; 
          case MotionEvent.ACTION_MOVE: 
            break; 
          case MotionEvent.ACTION_UP: 
            layoutIndex.setBackgroundColor(Color 
                .parseColor("#00ffffff")); 
            tv_show.setVisibility(View.GONE); 
            break; 
          } 
          return true; 
        } 
      }); 
    } 
  } 
   
  private void setData() { 
    persons = new ArrayList<Person>(); 
    Person p1 = new Person("耿琦"); 
    persons.add(p1); 
    Person p2 = new Person("王宝强"); 
    persons.add(p2); 
    Person p3 = new Person("柳岩"); 
    persons.add(p3); 
    Person p4 = new Person("文章"); 
    persons.add(p4); 
    Person p5 = new Person("马伊琍"); 
    persons.add(p5); 
    Person p6 = new Person("李晨"); 
    persons.add(p6); 
    Person p7 = new Person("张馨予"); 
    persons.add(p7); 
    Person p8 = new Person("韩红"); 
    persons.add(p8); 
    Person p9 = new Person("韩寒"); 
    persons.add(p9); 
    Person p10 = new Person("丹丹"); 
    persons.add(p10); 
    Person p11 = new Person("丹凤眼"); 
    persons.add(p11); 
    Person p12 = new Person("哈哈"); 
    persons.add(p12); 
    Person p13 = new Person("萌萌"); 
    persons.add(p13); 
    Person p14 = new Person("蒙混"); 
    persons.add(p14); 
    Person p15 = new Person("烟花"); 
    persons.add(p15); 
    Person p16 = new Person("眼黑"); 
    persons.add(p16); 
    Person p17 = new Person("许三多"); 
    persons.add(p17); 
    Person p18 = new Person("程咬金"); 
    persons.add(p18); 
    Person p19 = new Person("程哈哈"); 
    persons.add(p19); 
    Person p20 = new Person("爱死你"); 
    persons.add(p20); 
    Person p21 = new Person("阿莱"); 
    persons.add(p21); 
  } 
}

 此Activity的布局文件如下:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="match_parent" 
  android:background="#ffffff" 
  android:orientation="vertical" > 
  <TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:padding="10dp" 
    android:text="列表显示" 
    android:textColor="#000000" 
    android:textSize="16sp" /> 
  <FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff" > 
    <ListView 
      android:id="@+id/listView" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:cacheColorHint="#00000000" 
      android:fadingEdge="none" 
      android:scrollbars="none" > 
    </ListView> 
    <TextView 
      android:id="@+id/tv" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:layout_gravity="center" 
      android:background="#f0606060" 
      android:gravity="center" 
      android:text="A" 
      android:textColor="#ffffff" 
      android:textSize="30sp" /> 
    <LinearLayout 
      android:id="@+id/layout" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent" 
      android:layout_gravity="right" 
      android:background="#d7d7d7" 
      android:gravity="center" 
      android:orientation="vertical" > 
    </LinearLayout> 
  </FrameLayout> 
</LinearLayout> 

第二步:自定义了一个Adapter,代码如下:


package net.loonggg.test; 
import java.util.List; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
public class ListViewAdapter extends BaseAdapter { 
  private Context context; 
  private List<Person> list; 
  private ViewHolder viewHolder; 
  public ListViewAdapter(Context context, List<Person> list) { 
    this.context = context; 
    this.list = list; 
  } 
  @Override 
  public int getCount() { 
    return list.size(); 
  } 
  @Override 
  public Object getItem(int position) { 
    return list.get(position); 
  } 
  @Override 
  public long getItemId(int position) { 
    return position; 
  } 
  @Override 
  public boolean isEnabled(int position) { 
    // TODO Auto-generated method stub 
    if (list.get(position).getName().length() == 1)// 如果是字母索引 
      return false;// 表示不能点击 
    return super.isEnabled(position); 
  } 
  @Override 
  public View getView(int position, View convertView, ViewGroup parent) { 
    String item = list.get(position).getName(); 
    viewHolder = new ViewHolder(); 
    if (item.length() == 1) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.index, 
          null); 
      viewHolder.indexTv = (TextView) convertView 
          .findViewById(R.id.indexTv); 
    } else { 
      convertView = LayoutInflater.from(context).inflate(R.layout.item, 
          null); 
      viewHolder.itemTv = (TextView) convertView 
          .findViewById(R.id.itemTv); 
    } 
    if (item.length() == 1) { 
      viewHolder.indexTv.setText(list.get(position).getName()); 
    } else { 
      viewHolder.itemTv.setText(list.get(position).getName()); 
    } 
    return convertView; 
  } 
  private class ViewHolder { 
    private TextView indexTv; 
    private TextView itemTv; 
  } 
} 

第三步:用到的ListView中的子布局文件如下:
1、index.xml布局文件代码如下:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:background="#9c9c9c" 
  android:orientation="vertical" 
  android:paddingBottom="5dp" 
  android:paddingLeft="10dp" 
  android:paddingTop="5dp" > 
  <TextView 
    android:id="@+id/indexTv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#0f0f0f" /> 
</LinearLayout> 

2、item.xml布局文件代码如下:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:background="#ffffff" 
  android:orientation="vertical" 
  android:paddingBottom="5dp" 
  android:paddingLeft="20dp" 
  android:paddingTop="5dp" > 
  <TextView 
    android:id="@+id/itemTv" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#000000" 
    android:textSize="20sp" /> 
</LinearLayout> 

第四步:用到的实体类及工具类如下:
1、Person.java代码如下:


package net.loonggg.test; 
public class Person { 
  private String name; 
  private String pinYinName; 
  public Person(String name) { 
    super(); 
    this.name = name; 
  } 
  public Person(String name, String pinYinName) { 
    super(); 
    this.name = name; 
    this.pinYinName = pinYinName; 
  } 
  public String getName() { 
    return name; 
  } 
  public void setName(String name) { 
    this.name = name; 
  } 
  public String getPinYinName() { 
    return pinYinName; 
  } 
  public void setPinYinName(String pinYinName) { 
    this.pinYinName = pinYinName; 
  } 
} 

2、工具类代码如下:


package net.loonggg.test; 
import net.sourceforge.pinyin4j.PinyinHelper; 
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; 
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; 
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; 
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; 
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; 
public class StringHelper { 
   
  public static String getPingYin(String class="lazy" data-src) { 
    char[] t1 = null; 
    t1 = class="lazy" data-src.toCharArray(); 
    String[] t2 = new String[t1.length]; 
    HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat(); 
    t3.setCaseType(HanyuPinyinCaseType.LOWERCASE); 
    t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 
    t3.setVCharType(HanyuPinyinVCharType.WITH_V); 
    String t4 = ""; 
    int t0 = t1.length; 
    try { 
      for (int i = 0; i < t0; i++) { 
        // 判断是否为汉字字符 
        if (java.lang.Character.toString(t1[i]).matches( 
            "[\\u4E00-\\u9FA5]+")) { 
          t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3); 
          t4 += t2[0]; 
        } else { 
          t4 += java.lang.Character.toString(t1[i]); 
        } 
      } 
      return t4; 
    } catch (BadHanyuPinyinOutputFormatCombination e1) { 
      e1.printStackTrace(); 
    } 
    return t4; 
  } 
   
  public static String getHeadChar(String str) { 
    String convert = ""; 
    char word = str.charAt(0); 
    String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); 
    if (pinyinArray != null) { 
      convert += pinyinArray[0].charAt(0); 
    } else { 
      convert += word; 
    } 
    return convert.toUpperCase(); 
  } 
   
  public static String getPinYinHeadChar(String str) { 
    String convert = ""; 
    for (int j = 0; j < str.length(); j++) { 
      char word = str.charAt(j); 
      String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); 
      if (pinyinArray != null) { 
        convert += pinyinArray[0].charAt(0); 
      } else { 
        convert += word; 
      } 
    } 
    return convert.toUpperCase(); 
  } 
} 

到这里就完事,非常简单吧!

您可能感兴趣的文章:android仿微信通讯录搜索示例(匹配拼音,字母,索引位置)Android 实现带字母索引的侧边栏功能Android自定义View实现通讯录字母索引(仿微信通讯录)Android通用索引栏实现代码Android手机联系人快速索引(手机通讯录)android将搜索引擎设置为中国雅虎无法搜索问题解决方法android 左右滑动+索引图标实现方法与代码Android ItemDecoration 实现分组索引列表的示例代码


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android手机联系人带字母索引的快速查找

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android手机联系人带字母索引的快速查找

喜欢另辟蹊径的我,在这里废话不多说了,直接上代码和图片了。 效果图如下:第一步:MainActivity的代码如下:package net.loonggg.test; import java.util.ArrayList; import
2022-06-06

Android手机联系人快速索引(手机通讯录)

最近需要实现一个手机通讯录的快速索引功能。根据姓名首字母快速索引功能。下面是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂。下面上源码:源码中有注释。 下面是效果图:MainActivity:import java
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录