高仿通讯录按照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
原创粉丝点击