• Android 字母导航条实现


    在Activity中进行功能的实现,需要用到第三方jar包:pinyin4j.jar,此jar包用于将汉字转换为汉语拼音。

    首先,设置右侧边栏索引列表(A-Z),并且设置列表点击,Touch事件,点击索引,如果在内容列表中存在对应的数据,则自动跳转显示到那一条数据,如果没有则不处理,长按的时候在内容列表中显示当前选择了哪一项;
    获取内容列表list,并且获取此列表中联系人对象的名字所对应的第一个字母,将所有的联系人名字第一个字母取出(无重复),然后将两个列表合并,最后根据联系人或者是联系人组目录拼音进行排序比较;

    public class ContactsActivity extends Activity {
        private TextView tv_center = null;
        private ListView content; // 左边的联系人列表
        private ListView lvseek; // 右边的索引列表
        private HanyuPinyinOutputFormat spellFormat; // 转换汉字得到其汉语拼音
        private List<String> index_list = new ArrayList<String>(); // 联系人列表的组索引列表
        private ContactsAdapter adapter; // 联系人列表的适配器
    @Override
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contacts); init(); } /** * 初始化变量 */ private void init() { lvseek = (ListView) findViewById(R.id.layout); tv_center = (TextView) findViewById(R.id.tv);
    spellFormat
    = new HanyuPinyinOutputFormat(); spellFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); spellFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); spellFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
    content
    = (ListView) findViewById(R.id.listView1); setContent(content); setLvSeekAdapter(lvseek); setLvSeekListener(lvseek); } /** * 设置索引列表的数据源适配器 * * @param lvseek2 */ private void setLvSeekAdapter(ListView lvseek2) { AZAdapter adapter = new AZAdapter(this, getList()); int per_height = getResources().getDisplayMetrics().heightPixels / 26; adapter.setHeight(per_height); lvseek2.setAdapter(adapter); } /** * 设置seekLv事件响应 * * @param lvseek2 */ private void setLvSeekListener(final ListView lvseek2) { // Touch事件,按下和放开两个事件处理 lvseek2.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { tv_center.setVisibility(View.INVISIBLE); lvseek2.setBackgroundColor(Color.parseColor("#FDFDFD")); } else if (event.getAction() == MotionEvent.ACTION_DOWN) { lvseek2.setBackgroundColor(Color.parseColor("#F2F1F0")); } return false; } }); // 长按的时候在屏幕中间显示当前选择的是哪一个索引项 lvseek2.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { String str = (String) parent.getAdapter().getItem(position); tv_center.setVisibility(View.VISIBLE); tv_center.setText(str); int index = adapter.getItemIndex(str); if (index != -1) content.setSelection(index); return false; } });
    lvseek2.setOnItemClickListener(
    new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String str = (String) parent.getAdapter().getItem(position); int index = adapter.getItemIndex(str); if (index != -1) content.setSelection(index); } }); } /** * 将内容添加到列表 * * @param content2 */ private void setContent(ListView content2) { adapter = new ContactsAdapter(this, getList_content()); content2.setAdapter(adapter); } // 李四, 王五, 张三, 赵六 private List<Object> getList_content() { List<Object> list = new ArrayList<Object>(); List<Contact> contact_list = new ArrayList<Contact>(); contact_list.add(new Contact("张三", null, "")); contact_list.add(new Contact("李四", null, "")); 。。。// 将联系人添加进列表 list.addAll(contact_list); // 获取联系人索引列表 getIndex_List(contact_list); // 将索引列表添加进list; list.addAll(index_list); Collections.sort(list, new PinyinComparator()); return list; } /** * 根据联系人列表获取索引 * * @param list */ private void getIndex_List(List<Contact> list) { for (Contact con : list) { String pinying = PinyinHelper.toHanyuPinyinString(con.getName(), spellFormat, ""); String first_s = pinying.substring(0, 1); String str = first_s.toUpperCase(); if (isA_Z(str)) {// 首字母是a-z if (!index_list.contains(str)) { index_list.add(str); } } } } class PinyinComparator implements Comparator<Object> { // 比较器,在内容列表中有两种类型的数据,所以定义为Object; public int compare(Object o1, Object o2) { String str1; String str2; if (o1.getClass() == Contact.class) { str1 = ((Contact) o1).getName(); } else { str1 = o1.toString(); } if (o2.getClass() == Contact.class) { str2 = ((Contact) o2).getName(); } else { str2 = o2.toString(); } return chineneToSpell(str1).compareTo(chineneToSpell(str2)); } /** * 使用PinYin4j.jar将汉字转换为拼音 * * @param chineseStr * @return */ private String chineneToSpell(String chineseStr) { if (isChinese(chineseStr)) { String pinying = PinyinHelper.toHanyuPinyinString(chineseStr, spellFormat, ""); return pinying.toUpperCase(); } else return chineseStr; } } /** * 加载右边显示栏 * * @return */ private List<String> getList() { return Arrays.asList(Utils.RIGHT_INDEX); } }

    至此基本功能已经实现;
    补充:最近在学习的过程中,发现了另一种方式,相比前一种方式,更加合理,记录如下:

    public class MyTrackView extends View {
        private OnTrackListener listener;
        private String bg = "#40000000";
        private boolean showbg = false;
        private Paint paint = new Paint();
        private String[] b = new String[] { "#", "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 int choose = -1;
    
        public MyTrackView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public MyTrackView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyTrackView(Context context) {
            super(context);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            int item = (int) (event.getY() / getHeight() * b.length);
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (item >= 0 && item < b.length) {
                    showbg = true;
                    choose = item;
                    invalidate();
                    if (listener != null) {
                        listener.getStr(b[item]);
                    }
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (item >= 0 && item < b.length) {
                    showbg = true;
                    choose = item;
                    invalidate();
                    if (listener != null) {
                        listener.getStr(b[item]);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                showbg = false;
                choose = -1;
                invalidate();
                if (listener != null) {
                    listener.getStr(-1 + "");
                }
                break;
            }
            return true;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            int singleHeight = getHeight() / b.length;
            if (showbg) {
                canvas.drawColor(Color.parseColor(bg));
            }
            for (int i = 0; i < b.length; i++) {
                paint.setColor(Color.WHITE);
                paint.setAntiAlias(true);
                float textWidth = paint.measureText(b[i]);
                if (i == choose) {
                    paint.setColor(Color.RED);
                    paint.setFakeBoldText(true);
                }
                canvas.drawText(b[i], (getWidth() - textWidth) / 2, (i + 1)
                        * singleHeight, paint);
                paint.reset();
            }
            super.onDraw(canvas);
        }
    
        public void setTrackListener(OnTrackListener listener) {
            this.listener = listener;
        }
    
        interface OnTrackListener {
            public void getStr(String str);
        }
    }

    利用pinyin.jar轻松将汉字转换为拼音

    public class Main{private HanyuPinyinOutputFormat spellFormat; // 转换汉字得到其汉语拼音
    public Main() {
            spellFormat = new HanyuPinyinOutputFormat();
            spellFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
            spellFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
            spellFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
            Log.e(chineneToSpell("大家好"), "fuck");
        }
    
        /**
         * 使用PinYin4j.jar将汉字转换为拼音
         * 
         * @param chineseStr
         * @return
         */
        private String chineneToSpell(String chineseStr) {
            if (isChinese(chineseStr)) {
                String pinying = PinyinHelper.toHanyuPinyinString(chineseStr,
                        spellFormat, "");
                return pinying.toUpperCase();
            }
            return chineseStr;
        }
    
        /**
         * 判断字符串中是否包含有中文
         * 
         * @param str
         * @return
         */
        protected static boolean isChinese(String str) {
            String regex = "[\u4e00-\u9fa5]";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            return matcher.find();
        }
    
        /**
         * 判断是否是a-z
         * 
         * @param str
         * @return
         */
        protected static boolean isA2Z(String str) {
            String regex = "[A-Za-z]";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            return matcher.find();
        }
    }
  • 相关阅读:
    Redis批量删除key的小技巧,你知道吗?
    Spring条件注解@Conditional
    Spring Boot 2.X 如何快速集成单元测试?
    idea git提交时候提示 --author 'java_suisui' is not 'Name ' and matches no existing author
    Spring Boot 2.X 如何添加拦截器?
    SpringMVC+Mybatis 如何配置多个数据源并切换?
    Spring Boot 2.X 如何优雅的解决跨域问题?
    基于SSL实现MySQL的加密主从复制
    mysql -- mysql基于ssl的主从复制
    MySQL DB 主从复制之SSL
  • 原文地址:https://www.cnblogs.com/a284628487/p/3148299.html
Copyright © 2020-2023  润新知