高仿通讯录按照26字母排序和右边放置字母快捷查找
来源:互联网 发布:三网通游戏源码 编辑:程序博客网 时间:2024/05/17 02:33
功能原理:listview展示数据,截取字符串第一个字母进行识别判断,根据26个字母一次展示。
首先必须在gradle里面添加这个:
编译'com.belerweb:pinyin4j:2.5.1'
子布局可以写成这样:
下面直接贴代码,布局代码就不写了。写几个关键地方
package com.yz.demo.fieldmanagement;导入android.app.Activity;导入android.content.Context;import android.content.Intent;导入android.database.Cursor;导入android.graphics.PixelFormat;导入android.net.Uri;导入android.os.Bundle;导入android.os.Handler;导入android.support.v7.widget.DefaultItemAnimator;导入android.support.v7.widget.DividerItemDecoration;导入android.support.v7.widget.LinearLayoutManager;导入android.support.v7.widget.RecyclerView;导入android.text.TextUtils;导入android.util.Log;导入android.view.LayoutInflater;导入android.view.View;导入android.view.ViewGroup;导入android.view.WindowManager;导入android.widget.AdapterView;导入android.widget.ImageView;导入android.widget.LinearLayout;导入android.widget.ListView;导入android.widget.TextView;导入android.widget.Toast;import com.yz.demo.fieldmanagement.adapter.MyBookAdapter;import com.yz.demo.fieldmanagement.db.DBWrapper;import com.yz.demo.fieldmanagement.entity.AddBooks;import com.yz.demo.fieldmanagement.popupwindow.AddAddressBookPop;import com.yz.demo.fieldmanagement.unit.PinyinComparator;import com.yz.demo.fieldmanagement.view.MyLetterListView;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.exception.BadHanyuPinyinOutputFormatCombination;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;进口黄油刀进口butterknife.InjectView;进口butterknife.OnClick;/ ** *由管理员于2017/4/1创建。 *通讯录 * /public class AddressBook extends Activity { @InjectView(R.id.back) ImageView返回 @InjectView(R.id.add)ImageView add; @InjectView(R.id.listview) ListView listview; @InjectView(R.id.addressbookmain) LinearLayout地址簿主 私人MyBookAdapter myBookAdapter; private String name = null; private String phone = null; 私人DBWrapper dbWrapper; list List> ListAddBooks = new ArrayList <>(); 私人拼音比较器拼音比较器; private HashMap <String,Integer> alphaIndexer; private String [] section; 私人处理程序 private OverlayThread overlayThread; 私有TextView覆盖; @InjectView(R.id.myletter) MyLetterListView letterListView; @覆盖 protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); 的setContentView(R.layout.addressbook); dbWrapper = DBWrapper.getInstance(this); ButterKnife.inject(本); “通讯录”,“进入通讯录界面”); letterListView.setOnTouchingLetterChangedListener(new LetterListViewListener()); alphaIndexer = new HashMap <String,Integer>(); handler = new Handler(); overlayThread = new OverlayThread(); initOverlay(); selectAddBooks(); initEvent(); } private void selectAddBooks(){ 光标cursor = dbWrapper.selectTableBySpid(“addbooks”); if(cursor.getCount()!= 0){ cursor.moveToFirst(); AddBooks addBooks; for(int i = 0; i <cursor.getCount(); i ++){ addBooks = new AddBooks(); addBooks.setUserid(cursor.getString(cursor.getColumnIndex( “用户id”))); addBooks.setName(cursor.getString(cursor.getColumnIndex( “名称”))); addBooks.setPhone(cursor.getString(cursor.getColumnIndex( “手机”))); addBooks.setSortLetters(getAlpha(cursor.getString(cursor.getColumnIndex( “名称”)))); listAddBooks.add(addBooks); cursor.moveToNext(); } } else { 列表<Map <String,String >> list = new ArrayList <Map <String,String >>(); Map <String,String> map; map = new HashMap <>(); map.put( “姓名”, “海涛”); map.put( “电话”, “110”); list.add(地图); map = new HashMap <>(); map.put( “姓名”, “老朱”); map.put( “手机”, “120”); list.add(地图); map = new HashMap <>(); map.put( “姓名”, “翠花”); map.put( “电话”, “120”); list.add(地图); map = new HashMap <>(); map.put( “姓名”, “利肉”); map.put( “手机”, “1320”); list.add(地图); map = new HashMap <>(); map.put( “姓名”, “压卷”); map.put( “手机”, “152”); list.add(地图); map = new HashMap <>(); map.put( “姓名”, “杨钊”); map.put( “手机”, “111113”); list.add(地图); AddBooks addBooks; for(int i = 0; i <list.size(); i ++){ addBooks = new AddBooks(); addBooks.setUserid( “00101”); addBooks.setName(list.get(ⅰ)获得( “名称”)的toString()); addBooks.setPhone(list.get(ⅰ)获得( “手机”)的toString()); //获取首字母 addBooks.setSortLetters(getAlpha(list.get(ⅰ)获得( “名称”)的toString())。); dbWrapper.insertAddBooks(addBooks); listAddBooks.add(addBooks); } } } private void setDataForSec(){ alphaIndexer = new HashMap <String,Integer>(); sections = new String [listAddBooks.size()]; for(int i = 0; i <listAddBooks.size(); i ++){ String currentStr = listAddBooks.get(i).getSortLetters()。toString(); String previewStr =(i-1)> = 0?listAddBooks.get(i-1).getSortLetters()。toString():“”; if(!previewStr.equals(currentStr)){ String name = listAddBooks.get(i).getSortLetters()。toString(); alphaIndexer.put(name,i); section [i] = name; } } } 私有类OverlayThread实现Runnable { @覆盖 public void run(){ overlay.setVisibility(View.GONE); } } 私有类LetterListViewListener实现MyLetterListView.OnTouchingLetterChangedListener { @覆盖 public void onTouchingLetterChanged(final String s){ if(alphaIndexer.get(s)!= null){ int position = alphaIndexer.get(s); listview.setSelection(位置); overlay.setText(段[位置]); overlay.setVisibility(View.VISIBLE); handler.removeCallbacks(overlayThread); handler.postDelayed(overlayThread,1500); } } } private void initOverlay(){ LayoutInflater inflater = LayoutInflater.from(this); overlay =(TextView)inflater.inflate(R.layout.overlay,null); overlay.setVisibility(View.INVISIBLE); WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, PixelFormat.TRANSLUCENT); WindowManager windowManager =(WindowManager)this.getSystemService(Context.WINDOW_SERVICE); windowManager.addView(overlay,lp); } //获取汉字拼音的第一个字母 public String getAlpha(String text){ HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();//输出拼音全部小写 defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);//不带声调 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 尝试{ / **必须先截取字符串。有三种情况,第一种是汉字,第二种是英文,第三种是其他符号,这里英文和其他符号是识别不出来的,所以需要特别做出区分, * 1.汉字的直接转换成拼音,进行识别,不会影响 * 2.中文转换拼音是会出现空指针,因此可将截取的第一个字符送给str,也是正确的做法 * 3.其他字符转换拼音也会出现空指针,可将#送给str * / String c = text.substring(0,1); String str = PinyinHelper.toHanYuPinyinString(text,defaultFormat,“”,false); //如果是STR是空的话,正名传过来的是字母或者是其他符号 if(str.equals(“”)){ if(Character.isLetter(c.toCharArray()[0])){ str = c.toUpperCase(); } else { str =“#”; } } else { str = str.substring(0,1); } Log.i(“返回的拼音:”,str +“”+ c); 返回str;// System.out.println((String)PinyinHelper.toHanyuPinyinStringArray(//'鑫',defaultFormat)[0]);// System.out.println((String)PinyinHelper.toTongyongPinyinStringArray('鑫')[0]);// System.out.println((String)PinyinHelper.toWadeGilesPinyinStringArray('鑫')[0]);// System.out.println((String)PinyinHelper.toYalePinyinStringArray('鑫')[0]); } catch(BadHanyuPinyinOutputFormatCombination e){ e.printStackTrace(); } 返回“#”; } private void initEvent(){ pinyinComparator =新的拼音比较器(); //根据az进行排序源数据 Collections.sort(listAddBooks,pinyinComparator); setDataForSec(); myBookAdapter = new MyBookAdapter(this,listAddBooks); listview.setAdapter(myBookAdapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @覆盖 public void onItemClick(AdapterView <?> parent,View view,int position,long id){ Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse(“tel:”+ listAddBooks.get(position).getPhone())); if(intent.resolveActivity(getPackageManager())!= null){ startActivity(意向); } } }); } @OnClick({R.id.back,R.id.add}) void MyOnClick(查看视图){ switch(view.getId()){ 案例R.id.back: 完(); 打破; 案例R.id.add: 最后AddAddressBookPop addAddressBookPop = new AddAddressBookPop(this); addAddressBookPop.showPopupWindow(addressbookmain); addAddressBookPop.confirm.setOnClickListener(new View.OnClickListener(){ @覆盖 public void onClick(View view){ name = addAddressBookPop.name.getText()。toString(); phone = addAddressBookPop.phone.getText()。toString(); if((!TextUtils.isEmpty(name))&&(!TextUtils.isEmpty(phone))){ AddBooks addBooks = new AddBooks(); addBooks.setUserid( “00101”); addBooks.setName(名称); addBooks.setPhone(电话); String letter = getAlpha(name); addBooks.setSortLetters(字母); dbWrapper.insertAddBooks(addBooks); listAddBooks.add(addBooks); //根据az进行排序源数据 Collections.sort(listAddBooks,pinyinComparator); //排序后重新给alphaIndexer和部分赋值 setDataForSec(); listview.setAdapter(myBookAdapter); addAddressBookPop.dismiss(); } else { Toast.makeText(AddressBook.this, “名字或者电话不能为空”,Toast.LENGTH_SHORT).show(); addAddressBookPop.dismiss(); } } }); addAddressBookPop.headimage.setOnClickListener(new View.OnClickListener(){ @覆盖 public void onClick(View view){ } }); addAddressBookPop.cancel.setOnClickListener(new View.OnClickListener(){ @覆盖 public void onClick(View view){ addAddressBookPop.dismiss(); } }); 打破; } } @覆盖 protected void onDestroy(){ super.onDestroy(); }}
下面是适配器的代码
包com.yz.demo.fieldmanagement.adapter;导入android.content.Context;导入android.support.v7.widget.RecyclerView;导入android.view.LayoutInflater;导入android.view.View;导入android.view.ViewGroup;导入android.widget.BaseAdapter;导入android.widget.ImageView;导入android.widget.TextView;import com.yz.demo.fieldmanagement.R;import com.yz.demo.fieldmanagement.entity.AddBooks;import java.util.HashMap;import java.util.List;import java.util.Map;/ ** *由管理员于2017/3/31创建。 * /public class MyBookAdapter extends BaseAdapter { 私人上下文环境; 个人列表<AddBooks>列表;// public interface OnItemClickLitener// {// void onItemClick(View view,int position);// void onItemLongClick(View view,int position);//}//// private OnItemClickLitener mOnItemClickLitener;//// public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)// {// this.mOnItemClickLitener = mOnItemClickLitener;//}// public MyBookAdapter(Context context,List <AddBooks> list){ this.context = context; this.list = list; }//// @Override// public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){//// View view = LayoutInflater.from(context).inflate(R.layout.recycler_item,null);// view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));// MyViewHolder myViewHolder = new MyViewHolder(view);//// return myViewHolder;//}//// @Override// public void onBindViewHolder(RecyclerView.ViewHolder holder,final int position){// final MyViewHolder viewHolder =(MyViewHolder)holder;// AddBooks addBooks = list.get(position);// viewHolder.textView.setText(addBooks.getName());// viewHolder.phone.setText(addBooks.getPhone());// String currentStr = addBooks.getSortLetters();// String previewStr =(position-1)> = 0?list.get(position-1).getSortLetters():“”;// if(!previewStr.equals(currentStr)){// viewHolder.num.setVisibility(View.VISIBLE);// viewHolder.num.setText(currentStr);//} else {// viewHolder.num.setVisibility(View.GONE);//}// if(mOnItemClickLitener!= null){// viewHolder.view.setOnClickListener(new View.OnClickListener(){// @Override// public void onClick(View view){// mOnItemClickLitener.onItemClick(view,position);//}//});//}//} @覆盖 public int getCount(){ return list.size(); } @覆盖 public Object getItem(int position){ return list.get(position); } @覆盖 public long getItemId(int position){ 返回位置 } @覆盖 public View getView(int position,View convertView,ViewGroup parent){ MyViewHolder持有人 if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.recycler_item,null); holder = new MyViewHolder(); holder.imageView =(ImageView)convertView.findViewById(R.id.image); holder.textView =(TextView)convertView.findViewById(R.id.text); holder.phone =(TextView)convertView.findViewById(R.id.phone); holder.num =(TextView)convertView.findViewById(R.id.num); convertView.setTag(保持器); } else { holder =(MyViewHolder)convertView.getTag(); } AddBooks addBooks = list.get(position); holder.textView.setText(addBooks.getName()); holder.phone.setText(addBooks.getPhone()); String currentStr = addBooks.getSortLetters(); String previewStr =(position-1)> = 0?list.get(position-1).getSortLetters():“”; if(!previewStr.equals(currentStr)){ holder.num.setVisibility(View.VISIBLE); holder.num.setText(currentStr); } else { holder.num.setVisibility(View.GONE); } 返回convertView; } MyViewHolder类{ ImageView imageView; TextView textView; TextView手机; TextView num; 查看视图; }}
里面还需要一个自定义视图存放字母
包com.yz.demo.fieldmanagement.view;导入android.content.Context;导入android.graphics.Canvas;导入android.graphics.Color;导入android.graphics.Paint;导入android.graphics.Typeface;导入android.util.AttributeSet;导入android.view.MotionEvent;导入android.view.View;public class MyLetterListView extends View {OnTouchingLetterChangedListener onTouchingLetterChangedListener;String [] b = {“A”,“B”,“C”,“D”,“E”,“F”,“G”,“H”,“I”,“J” “L”, “M”, “N”, “O”, “P”, “Q”, “R”, “S”, “T”, “U”, “V”, “W”, “X”,” Y”, “Z”, “#”};int choose = -1;油漆漆=新油漆();boolean showBkg = false;public MyLetterListView(Context context,AttributeSet attrs,int defStyle){超级(上下文,attrs,defStyle);}public MyLetterListView(Context context,AttributeSet attrs){超级(上下文,attrs);}public MyLetterListView(Context context){超级(上下文);}@覆盖protected void onDraw(Canvas canvas){super.onDraw(帆布);如果(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.setColor(Color.BLACK);paint.setTextSize(20); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(真); if(i == choose){ paint.setColor(Color.parseColor( “#3399ff”)); paint.setFakeBoldText(真); } float xPos = width / 2 - paint.measureText(b [i])/ 2; float yPos = singleHeight * i + singleHeight; canvas.drawText(b [i],xPos,yPos,paint); paint.reset(); } }@覆盖public boolean dispatchTouchEvent(MotionEvent event){final int action = event.getAction(); final float y = event.getY(); final int oldChoose = choose; 最终OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c =(int)(y / getHeight()* b.length); 开关(动作){case MotionEvent.ACTION_DOWN:showBkg = true;if(oldChoose!= c && listener!= null){if(c> 0 && c <b.length){listener.onTouchingLetterChanged(B [C]);choose = c;无效();}}打破;案例MotionEvent.ACTION_MOVE:if(oldChoose!= c && listener!= null){if(c> 0 && c <b.length){listener.onTouchingLetterChanged(B [C]);choose = c;无效();}}打破;案例MotionEvent.ACTION_UP:showBkg = false;选择= -1;无效();打破;}返回真}@覆盖public boolean onTouchEvent(MotionEvent event){返回super.onTouchEvent(event);}public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener){this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;}公共接口OnTouchingLetterChangedListener {public void onTouchingLetterChanged(String s);}}大功告成
1 0
- 高仿通讯录按照26字母排序和右边放置字母快捷查找
- 高仿android通讯录--右边字母排序功能
- 仿通讯录快速索引的实现原理(包括中间的字母图和右边的索引条),例IndexableListView
- 汉字按照字母排序
- 自定义SlideBar实现仿通讯录效果按字母排序
- 字符串数组按照字母排序
- string数组按照字母排序
- 仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话
- 仿苹果手机通讯录按字母定位
- Android 高仿猎豹cm桌面,所有应用,快捷字母栏
- 使用Java统计字母并且按照字母的次数排序
- dedecms文章标题按照字母排序
- 微软Java面试题-按照字母排序
- android 按照字母的顺序排序
- 按照首先字母进行元素排序
- 实现按照字母分类分组排序
- 给Map排序---按照key的字母
- Android数组列表按照字母排序
- Boolan C++面向对象高级编程(下)第四周笔记
- stm32时钟分割
- java1.8新特性之接口定义增强
- 二叉搜索树与双向链表
- ssh连接永久保持
- 高仿通讯录按照26字母排序和右边放置字母快捷查找
- Android中getActivity()为null的解决办法
- qt qss设置
- Redis主从复制
- CTSC2017 总结
- cortex-m3 的汇编文件学习
- api level 对照
- 防止头文件中重复定义的小方法
- java基础---->Base64算法的使用