仿手机通讯录效果

先看效果图



汉字排序

/**
 * 汉字排序
 */
public class LanguageComparator_CN implements Comparator<String> {

    public int compare(String ostr1String ostr2) {
        for (int i = 0i < ostr1.length() && i < ostr2.length()i++) {
            int codePoint1 = ostr1.charAt(i);
            int codePoint2 = ostr2.charAt(i);
            if (Character.isSupplementaryCodePoint(codePoint1)
                    || Character.isSupplementaryCodePoint(codePoint2)) {
                i++;
            }
            if (codePoint1 != codePoint2) {
                if (Character.isSupplementaryCodePoint(codePoint1)
                        || Character.isSupplementaryCodePoint(codePoint2)) {
                    return codePoint1 - codePoint2;
                }
                String pinyin1 = pinyin((char) codePoint1);
                String pinyin2 = pinyin((char) codePoint2);

                if (pinyin1 != null && pinyin2 != null) { // 两个字符都是汉字
                    if (!pinyin1.equals(pinyin2)) {
                        return pinyin1.compareTo(pinyin2);
                    }
                } else {
                    return codePoint1 - codePoint2;
                }
            }
        }
        return ostr1.length() - ostr2.length();
    }

    // 获得汉字拼音的首字符
    private String pinyin(char c) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}

 

侧边A-Z字母控件,带拉划事件在界面中心显示接口

/**
 * Created by lenovo on 2015/10/27.
 */
public class AssortView extends Button {

    public interface OnTouchAssortListener {
        public void onTouchAssortListener(String s);
        public void onTouchAssortUP();
    }

    public AssortView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    public AssortView(Context contextAttributeSet attrs) {
        super(contextattrs);
        // TODO Auto-generated constructor stub
    }

    public AssortView(Context contextAttributeSet attrs, int defStyle) {
        super(contextattrsdefStyle);
        // TODO Auto-generated constructor stub
    }

    // 分类
    private String[] assort = { "?""#""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 Paint paint new Paint();
    // 选择的索引
    private int selectIndex = -1;
    // 字母监听器
    private OnTouchAssortListener onTouch;


    public void setOnTouchAssortListener(OnTouchAssortListener onTouch) {
        this.onTouch = onTouch;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        int height = getHeight();
        int width = getWidth();
        int interval = height / assort.length;

        for (int i = 0length = assort.lengthi < lengthi++) {
            // 抗锯齿
            paint.setAntiAlias(true);
            // 默认粗体
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            // 白色
            paint.setColor(Color.WHITE);
            paint.setTextSize(30);
            if (i == selectIndex) {
                // 被选择的字母改变颜色和粗体
                paint.setColor(Color.parseColor("#3399ff"));
                paint.setFakeBoldText(true);
                paint.setTextSize(40);
            }
            // 计算字母的X坐标
            float xPos = width / paint.measureText(assort[i]) / 2;
            // 计算字母的Y坐标
            float yPos = interval * i + interval;
            canvas.drawText(assort[i]xPosyPospaint);
            paint.reset();
        }

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        float y = event.getY();
        int index = (int) (y / getHeight() * assort.length);
        if (index >= && index < assort.length) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    // 如果滑动改变
                    if (selectIndex != index) {
                        selectIndex = index;
                        if (onTouch != null) {
                            onTouch.onTouchAssortListener(assort[selectIndex]);
                        }

                    }
                    break;
                case MotionEvent.ACTION_DOWN:
                    selectIndex = index;
                    if (onTouch != null) {
                        onTouch.onTouchAssortListener(assort[selectIndex]);
                    }

                    break;
                case MotionEvent.ACTION_UP:
                    if (onTouch != null) {
                        onTouch.onTouchAssortUP();
                    }
                    selectIndex = -1;
                    break;
            }
        } else {
            selectIndex = -1;
            if (onTouch != null) {
                onTouch.onTouchAssortUP();
            }
        }
        invalidate();

        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }
}

3布局xml文件

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ExpandableListView
        android:id="@+id/elist"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:groupIndicator="@null" />

    <com.scdl.zny.view.AssortView
        android:id="@+id/assort"
        android:layout_width="30dip"
        android:layout_height="fill_parent"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />
</RelativeLayout>

4 adapter适配器

/**
 * Created by lenovo on 2015/10/27.
 */
public class PinyinAdapter extends BaseExpandableListAdapter {

    // 字符串
    private List<String> strList;
    private AssortPinyinList assort new AssortPinyinList();
    private UserKeyByString  userKeynew UserKeyByString();
    private List<Users>list;
    private Context context;

    private LayoutInflater inflater;
    // 中文排序
    private LanguageComparator_CN cnSort new LanguageComparator_CN();

    public PinyinAdapter(Context contextList<Users> list) {
        super();
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.list = list;
        if (list == null) {
            list = new ArrayList<Users>();
        }
        // 排序
        sort();
    }

    private void sort() {
        // 分类
        for (Users u : list) {
            userKey.add(u);
            assort.getHashList().add(u.getName());
        }
        assort.getHashList().sortKeyComparator(cnSort);
        for (int i = 0length = assort.getHashList().size()i < lengthi++) {
            Collections.sort((assort.getHashList().getValueListIndex(i))cnSort);

        }
    }

    public Object getChild(int group, int child) {
        // TODO Auto-generated method stub
        return assort.getHashList().getValueIndex(groupchild);
    }

    public long getChildId(int group, int child) {
        // TODO Auto-generated method stub
        return child;
    }

    public View getChildView(int group, int child, boolean arg2,
                             View contentViewViewGroup arg4) {
        // TODO Auto-generated method stub
        if (contentView == null) {
            contentView = inflater.inflate(R.layout.adapter_chat, null);
        }
        TextView name = (TextView) contentView.findViewById(R.id.name);
        TextView phone = (TextView) contentView.findViewById(R.id.phone);
        TextView adress = (TextView) contentView.findViewById(R.id.adress);
        String s = assort.getHashList().getValueIndex(groupchild);
        Users u=userKey.getHashList().get(s);
        name.setText(u.getName());
        phone.setText(u.getPhone());
        adress.setText(u.getDanw());
        return contentView;
    }

    public int getChildrenCount(int group) {
        // TODO Auto-generated method stub
        return assort.getHashList().getValueListIndex(group).size();
    }

    public Object getGroup(int group) {
        // TODO Auto-generated method stub
        return assort.getHashList().getValueListIndex(group);
    }

    public int getGroupCount() {
        // TODO Auto-generated method stub
        return assort.getHashList().size();
    }

    public long getGroupId(int group) {
        // TODO Auto-generated method stub
        return group;
    }

    public View getGroupView(int group, boolean arg1View contentView,
                             ViewGroup arg3) {
        if (contentView == null) {
            contentView = inflater.inflate(R.layout.list_group_item, null);
            contentView.setClickable(true);
        }
        TextView textView = (TextView) contentView.findViewById(R.id.name);
        String s = assort.getFirstChar(assort.getHashList().getValueIndex(group0));
        textView.setText(s);
        // 禁止伸展

        return contentView;
    }

    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return true;
    }

    public boolean isChildSelectable(int arg0, int arg1) {
        // TODO Auto-generated method stub
        return true;
    }

    public AssortPinyinList getAssort() {
        return assort;
    }

}

 在这里使用到了一个泛型辅助类

/**
 * Created by lenovo on 2015/10/26.
 * 键值对索引排序的工具类 HashMap简单排序的一种实现
 *
 * @param <K>
 * @param <V>
 */
public class HashList<K, V> {

    /**
     * 键值集合
     */
    private List<K> keyArr = new ArrayList<K>();
    /**
     * 键值对映射
     */
    private HashMap<K, List<V>> map = new HashMap<K, List<V>>();
    /**
     * 键值分类
     */
    private KeySort<K, V> keySort;

    public HashList(KeySort<K, V> keySort) {
        // TODO Auto-generated constructor stub
        this.keySort = keySort;
    }

    /**
     * 根据value值返回key
     */

    public K getKey(V v) {
        return keySort.getKey(v);
    }



    /**
     * 键值对排序
     *
     * @param comparator
     */
    public void sortKeyComparator(LanguageComparator_CN comparator) {
        Collections.sort(keyArr, (Comparator<? super K>) comparator);
    }

    /**
     * 根据索引返回键值
     */
    public K getKeyIndex(int key) {
        return keyArr.get(key);
    }

    /**
     * 根据索引返回键值对
     */
    public List<V> getValueListIndex(int key) {
        return map.get(getKeyIndex(key));
    }



    public V getValueIndex(int key, int value) {
        return getValueListIndex(key).get(value);

    }

    public int size() {
        return keyArr.size();
    }

    public void clear() {
        for (Iterator<K> it = map.keySet().iterator(); it.hasNext(); map.remove(it.next())) ;
    }

    public boolean contains(Object object) {
        // TODO Auto-generated method stub
        return false;
    }

    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return false;
    }

    public Object remove(int location) {
        // TODO Auto-generated method stub
        return null;
    }

    public boolean remove(Object object) {
        // TODO Auto-generated method stub
        return false;
    }

    public boolean removeAll(Collection arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    public boolean retainAll(Collection arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    public Object set(int location, Object object) {
        // TODO Auto-generated method stub
        return keyArr.set(location, (K) object);
    }

    public List subList(int start, int end) {
        // TODO Auto-generated method stub
        return keyArr.subList(start, end);
    }

    public Object[] toArray() {
        // TODO Auto-generated method stub
        return keyArr.toArray();
    }

    public Object[] toArray(Object[] array) {
        return keyArr.toArray(array);
    }

    public boolean add(Object object) {
        V v = (V) object;
        K key = getKey(v);
        if (!map.containsKey(key)) {
            List<V> list = new ArrayList<V>();
            list.add(v);
            keyArr.add(key);
            map.put(key, list);
        } else {
            map.get(key).add(v);
        }
        return false;
    }

    public int indexOfKey(K k) {
        return keyArr.indexOf(k);
    }
}

 

/**
 * Created by lenovo on 2015/10/27.
 */
public class UserKeyByString {
    private HashMap<String, Users> hashList = new HashMap<>();

    public HashMap<String, Users> getHashList() {
        return hashList;
    }

    public void add(Users u) {
        hashList.put(u.getName(), u);
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值