演示

汉字转拼音

String pinyingStr = PinyinHelper.getShortPinyin(
String.valueOf(charSequence).toLowerCase().trim());

获取分组Key(A,B,C….#)

    @Nullable
private String getPingyingKey(String pinyinString) {
//将拼音字符串转换为大写拼音
if(pinyinString == null && pinyinString.length() == 0) return null;
//获取大写拼音字符串的第一个字符
char tempChar = pinyinString.charAt(0);
String key;
if (tempChar < 'a' || tempChar > 'z') {
key = "#";
} else {
key = String.valueOf(tempChar).toUpperCase(); }
return key;
}

将无序的Map集合转换为按照字母排序的有序List

private List<Map.Entry<String, List<GoodFriendsInfo>>> mGroupingData = new ArrayList<>();
private List<Map.Entry<String, List<GoodFriendsInfo>>> mReserchGroupingData = new ArrayList<>();
/**
* 分组成Map集合
*/
public void toGropingTypeData(List<GoodFriendsInfo> list) {
List<GoodFriendsInfo> tempList;
Map<String, List<GoodFriendsInfo>> tempMap = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
GoodFriendsInfo contactsModel1 = list.get(i);
if(contactsModel1 == null) continue;
String pinyinString = PinyinHelper.getShortPinyin(
contactsModel1.getName().toLowerCase().trim());
contactsModel1.setPyname(pinyinString);
String key = getPingyingKey(pinyinString);
if (key == null) continue;
tempList = tempMap.get(key);
if(tempList == null){
tempList = new ArrayList<>();
}
tempList.add(contactsModel1);
tempMap.put(key, tempList);
}
Set<Map.Entry<String, List<GoodFriendsInfo>>> setEntry = tempMap.entrySet();
mGroupingData = new ArrayList<>(setEntry);
Collections.sort(mGroupingData, new Comparator<Map.Entry<String, List<GoodFriendsInfo>>>() {
@Override
public int compare(Map.Entry<String, List<GoodFriendsInfo>> entry1, Map.Entry<String, List<GoodFriendsInfo>> entry2) {
if(entry1.getKey().equals("#")){
return 1;
}else if(entry2.getKey().equals("#")){
return -1;
}else{
Character c1 = entry1.getKey().charAt(0);
Character c2 = entry2.getKey().charAt(0);
return c1 - c2;
}
}
});
}

监听输入事件,判断输入文字拼音首字母筛选列表

mReserchFriend.addTextChangedListener(new TextWatcher() {

            @Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int afte) { } @Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if(charSequence.length() == 0){
mResearchPy = "";
mReserchGroupingData.clear();
bindview(mGroupingData);
}else {
String pinyingStr = PinyinHelper.getShortPinyin(
String.valueOf(charSequence).toLowerCase().trim());
String key = getPingyingKey(pinyingStr);
if(key == null || mResearchPy.equals(pinyingStr)) return;
mResearchPy = pinyingStr;
mReserchGroupingData.clear();
for (int i = 0; i< mGroupingData.size();i++){
if(mGroupingData.get(i).getKey().equals(key)){
Map<String, List<GoodFriendsInfo>> searchMap = new HashMap<String, List<GoodFriendsInfo>>();
List<GoodFriendsInfo> goodFriendsList = new ArrayList<>(mGroupingData.get(i).getValue());
for(int j = goodFriendsList.size() - 1; j >= 0; j--){
if(!goodFriendsList.get(j).getPyname().contains(mResearchPy)){
goodFriendsList.remove(j);
}
}
searchMap.put(key, goodFriendsList);
Set<Map.Entry<String, List<GoodFriendsInfo>>> searchSet = searchMap.entrySet();
mReserchGroupingData.add(searchSet.iterator().next());
bindview(mReserchGroupingData);
break;
}
}
}
} @Override
public void afterTextChanged(Editable editable) { }
});
bindview(mGroupingData);
}

注释:

1,上面保存了上次搜索索引(mResearchPy),避免重复搜索。

2,注意删除集合中数据要重新创建集合不然会删除原始数据。

全部代码

package com.xl.undercover.view.user;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.EditText;
import android.widget.ExpandableListView;
import android.widget.TextView; import com.xl.undercover.R;
import com.xl.undercover.model.entry.GoodFriendsInfo;
import com.xl.undercover.util.LogUtil;
import com.xl.undercover.view.base.BaseActivity; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set; import opensource.jpinyin.PinyinHelper; /**
* Created by lijiyuan on 2017/2/13.
* 好友界面,可搜索
*/ public class GoodFriendsActivity extends BaseActivity { private String mResearchPy = "";
private List<GoodFriendsInfo> mGoodFriendsData;
private ExpandableListView mExpandableListView;
private List<Map.Entry<String, List<GoodFriendsInfo>>> mGroupingData = new ArrayList<>();
private List<Map.Entry<String, List<GoodFriendsInfo>>> mReserchGroupingData = new ArrayList<>(); private EditText mReserchFriend;
@Override
protected void handleMessage(Message msg) { } @Override
protected int getContentView() {
return R.layout.activity_goodfriends;
} @Override
protected void initView() {
mExpandableListView = getView(R.id.listview_goodfriends);
mReserchFriend = getView(R.id.edit_reserch_friend); mGoodFriendsData = getData();
toGropingTypeData(mGoodFriendsData); mReserchFriend.addTextChangedListener(new TextWatcher() { @Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int afte) { } @Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if(charSequence.length() == 0){
mResearchPy = "";
mReserchGroupingData.clear();
bindview(mGroupingData);
}else {
String pinyingStr = PinyinHelper.getShortPinyin(
String.valueOf(charSequence).toLowerCase().trim());
String key = getPingyingKey(pinyingStr);
if(key == null || mResearchPy.equals(pinyingStr)) return;
mResearchPy = pinyingStr;
mReserchGroupingData.clear();
for (int i = 0; i< mGroupingData.size();i++){
if(mGroupingData.get(i).getKey().equals(key)){
Map<String, List<GoodFriendsInfo>> searchMap = new HashMap<String, List<GoodFriendsInfo>>();
List<GoodFriendsInfo> goodFriendsList = new ArrayList<>(mGroupingData.get(i).getValue());
for(int j = goodFriendsList.size() - 1; j >= 0; j--){
if(!goodFriendsList.get(j).getPyname().contains(mResearchPy)){
goodFriendsList.remove(j);
}
}
searchMap.put(key, goodFriendsList);
Set<Map.Entry<String, List<GoodFriendsInfo>>> searchSet = searchMap.entrySet();
mReserchGroupingData.add(searchSet.iterator().next());
bindview(mReserchGroupingData);
break;
}
}
}
} @Override
public void afterTextChanged(Editable editable) { }
});
bindview(mGroupingData);
}
private void bindview(List<Map.Entry<String, List<GoodFriendsInfo>>> mData) {
mExpandableListView.setAdapter(new GoodFriendsAdapter(mData));
mExpandableListView.setGroupIndicator(null);
for (int i = 0; i < mData.size(); i++) {
mExpandableListView.expandGroup(i);
}
mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
return true;
}
});
} @Override
protected void initData() { } @Override
protected void startMine(Context context, Bundle bundle) { } @Override
public void turnToOtherView() { } /**
* 分组成Map集合
*/
public void toGropingTypeData(List<GoodFriendsInfo> list) {
List<GoodFriendsInfo> tempList;
Map<String, List<GoodFriendsInfo>> tempMap = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
GoodFriendsInfo contactsModel1 = list.get(i);
if(contactsModel1 == null) continue;
String pinyinString = PinyinHelper.getShortPinyin(
contactsModel1.getName().toLowerCase().trim());
contactsModel1.setPyname(pinyinString);
String key = getPingyingKey(pinyinString);
if (key == null) continue;
tempList = tempMap.get(key);
if(tempList == null){
tempList = new ArrayList<>();
}
tempList.add(contactsModel1);
tempMap.put(key, tempList);
}
Set<Map.Entry<String, List<GoodFriendsInfo>>> setEntry = tempMap.entrySet();
mGroupingData = new ArrayList<>(setEntry);
Collections.sort(mGroupingData, new Comparator<Map.Entry<String, List<GoodFriendsInfo>>>() {
@Override
public int compare(Map.Entry<String, List<GoodFriendsInfo>> entry1, Map.Entry<String, List<GoodFriendsInfo>> entry2) {
if(entry1.getKey().equals("#")){
return 1;
}else if(entry2.getKey().equals("#")){
return -1;
}else{
Character c1 = entry1.getKey().charAt(0);
Character c2 = entry2.getKey().charAt(0);
return c1 - c2;
}
}
});
} @Nullable
private String getPingyingKey(String pinyinString) {
//将拼音字符串转换为大写拼音
if(pinyinString == null && pinyinString.length() == 0) return null;
//获取大写拼音字符串的第一个字符
char tempChar = pinyinString.charAt(0);
String key;
if (tempChar < 'a' || tempChar > 'z') {
key = "#";
} else {
key = String.valueOf(tempChar).toUpperCase(); }
return key;
} /**
* 初始化数据
*/
public List<GoodFriendsInfo> getData() {
List<GoodFriendsInfo> list = new ArrayList<>();
GoodFriendsInfo contactsModel;
String[] nameStrings = {"覃", "岑", "$来啊,来互相伤害啊", "疍姬", "梵蒂冈", "亳州",
"佟", "郄", "张三", "Edward", "李四", "萌萌哒", "霾耷", "离散", "赵信", "啦啦",
"辣妹子", "嗷嗷", "妹妹", "']asd", "%Hello"};
for (int i = 0; i < nameStrings.length; i++) {
contactsModel = new GoodFriendsInfo();
contactsModel.setName(nameStrings[i]);
list.add(contactsModel);
}
return list;
} class GoodFriendsAdapter extends BaseExpandableListAdapter{
List<Map.Entry<String, List<GoodFriendsInfo>>> mGroupData;
public GoodFriendsAdapter(List<Map.Entry<String, List<GoodFriendsInfo>>> mData) {
mGroupData = mData;
} @Override
public int getGroupCount() {
return mGroupData.size();
} @Override
public int getChildrenCount(int i) {
Map.Entry<String, List<GoodFriendsInfo>> child = mGroupData.get(i);
if(child == null) return 0;
return child.getValue().size();
} @Override
public Object getGroup(int i) {
return mGroupData.get(i);
} @Override
public Object getChild(int i, int i1) {
Map.Entry<String, List<GoodFriendsInfo>> child = mGroupData.get(i);
if(child == null) return null;
return child.getValue();
} @Override
public long getGroupId(int i) {
return i;
} @Override
public long getChildId(int i, int i1) {
return i1;
} @Override
public boolean hasStableIds() {
return false;
} @Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
if (view == null) {
view = getLayoutInflater().inflate( R.layout.iterm_goodfriends_parent,null);
}
TextView text = (TextView) view.findViewById(R.id.text_friend_category);
text.setText(mGroupData.get(i).getKey());
return view;
} @Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
if (view == null) {
view = getLayoutInflater().inflate( R.layout.iterm_goodfriends_child,null);
}
//ImageView mFriendPic = (ImageView) view.findViewById(R.id.image_friend_picture);
TextView mFriendname = (TextView) view.findViewById(R.id.text_friend_name);
//TextView mFriendFollow = (Button) view.findViewById(R.id.btn_friend_follow);
List<GoodFriendsInfo> entryData = mGroupData.get(i).getValue();
mFriendname.setText(entryData.get(i1).getName());
return view;
} @Override
public boolean isChildSelectable(int i, int i1) {
return false;
}
} public static void startActivity(Context context){
Intent intent = new Intent(context, GoodFriendsActivity.class);
context.startActivity(intent);
} }

Android联系人列表实现的更多相关文章

  1. Android带索引联系人列表

    网上Android联系人列表的样例也非常多,都和微信的联系人差点儿相同,因为项目用到了联系人列表索引功能(产品把字母item给去掉了),只是也还是好实现.这里我也来分享分享我的实现,免得以后忘了.那先 ...

  2. Android实现SQLite数据库联系人列表

    Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...

  3. 【Android Developers Training】 98. 获取联系人列表

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. Android UI(五)云通讯录项目之联系人列表,带侧滑选择,带搜索框

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节.交流QQ群:[编程之美 365234583]h ...

  5. Android权限列表permission说明

    网络上不乏android权限列表,但是很少有将列表和使用方法放在一起的,所以特此总结一下 需要在AndroidManifest.xml中定义相应的权限(以获取internet访问权限为例),如下: & ...

  6. android权限列表

    原文:[转]android权限列表 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略 ...

  7. 动手分析安卓仿QQ联系人列表TreeView控件

    因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码.   一. 需要用 ...

  8. WPF 自定义TreeView控件样式,仿QQ联系人列表

    一.前言 TreeView控件在项目中使用比较频繁,普通的TreeView并不能满足我们的需求.因此我们需要滴对TreeView进行改造.下面的内容将介绍仿QQ联系人TreeView样式及TreeVi ...

  9. Android版本号列表

    Android版本号列表

随机推荐

  1. 一个需求认识CSS3 的transform-origin属性

    最近遇到一个需求,是以前做PHP的同事问我的问题    下面是他在百度发的问题截图 根据上面的截图,我稍微梳理了一下 问题:现在有个div,旋转45度后,这个div的宽度会动态改变,并且要向右上方偏移 ...

  2. Mysql主从配置实战

    实战mysql主从配置 准备两个docker容器,分别在3306和3307开启两个mysql为主从数据库 可执行以下命令 docker run -p 3306:3306 --name mysql330 ...

  3. PowerShell 实现批量下载文件

    简介 批量文件下载器 PowerShell 版,类似于迅雷批量下载功能,且可以破解 Referer 防盗链 源代码 [int]$script:completed = 0 # 下载完成数量 [int]$ ...

  4. Centos 基本命令不能用恢复方法

    遇到命令都不能用,直接执行下面的语句就可以: export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/roo ...

  5. extjs 解决使用store.sync()方法更新item有时不触发后台action的问题

    问题描述: extjs 解决使用store.sync()方法更新item有时不触发后台action,不出发后台action的原因是item的字段值没有变化 解决方法: item.setDirty(tr ...

  6. IdentityServer Resource Owner Password

    Resource Owner Password 模式需要自己实现用户名密码的校验 新增ResourceOwnerPasswordValidator实现IResourceOwnerPasswordVal ...

  7. 刷完500道BAT面试题,我能去面试大厂了吗?

    面试之前先刷几篇面经,或者做几道热门面试题,想必是大家很熟悉的一种复习方式了,就像我们当年经常做五年高考三年模拟一样.但是可不要把面试题和面经当成你的主要复习方式,它只是锦上添花,绝非雪中送炭! 壹面 ...

  8. 如何正确的在项目中接入微信JS-SDK

    微信JS-SDK的功能 如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了.微信的官方文档描述如下. 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. ...

  9. Node.js 获取微信JS-SDK CONFIG

    背景 前端在调用微信提供的分享.拍照.扫一扫等功能时需要到后台获取配置,主要是签名(signature).Node 开发可以用朴灵大佬的SDK--co-wechat-api. 配置 到微信公众平台进入 ...

  10. DWR第四篇之对象传参

    1. 本示例在第一篇架构基础上添加代码 2. 首先,在dwr.xml文件里添加对象转换器 3. 编写Person实体类 package com.skyer.vo; import java.util.A ...