当前位置:  首页  >  PHP资讯  >  业界资讯

Android仿微信联系人列表字母侧滑控件

这篇文章主要为大家详细介绍了Android仿微信联系人列表字母侧滑控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

仿微信联系人列表字母侧滑控件, 侧滑控件参考了以下博客:

Android实现ListView的A-Z字母排序和过滤搜索功能

首先分析一下字母侧滑控件应该如何实现,根据侧滑控件的高度和字母的数量来平均计算每个字母应该占据的高度。

在View的onDraw()方法下绘制每一个字母

 protected void onDraw(Canvas canvas) { super.onDraw(canvas); int height = getHeight();// 获取对应高度 int width = getWidth(); // 获取对应宽度 int singleHeight = height / getData().size();// 获取每一个字母的高度 for (int i = 0; i  

然后再看一下触控事件的拦截处理

 @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY();// 点击y坐标 final int lastPosition = mPosition;//记录上一次选中字母的位置 final int position = (int) (y / getHeight() * getData().size());// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数. switch (action) { //当手指离开 case MotionEvent.ACTION_UP: //设置侧滑控件的背景色 setBackgroundColor(getBackgroundNormalColor()); mPosition = -1; invalidate(); if (getOnTouchLetterListener() != null) { //回调事件,告知当前手指已经离开当前区域 getOnTouchLetterListener().onTouchOutside(); } break; default: //更改当字母为选中状态时控件的背景色 setBackgroundColor(getBackgroundPressedColor()); //如果选中字母的位置不等于上一次选中的位置 if (lastPosition != position) { if (position >= 0 && position  

侧滑控件完成后, 再分析一下分组界面是怎么实现的,不同分组由不同的字母作为标题,用ListView就可以实现,ListView里使用的Adapter里面有一个方法getItemViewType()方法用于区分返回多种类型的View,这里我们就两种, 一个是标题,一个是联系人信息;顶部里那些新的朋友、群聊等可以用ListView的addHeaderView()实现。但是用最SDK自带的BaseAdapter实现分组的话也不方便,实际上我们可以进一步包装;

首先看一下最基本的Adapter封装:

 public abstract class SimpleAdapter extends BaseAdapter { protected Context mContext; protected List mData; public SimpleAdapter(){} public SimpleAdapter(Context context, List data){ init(context, data); } public void init(Context context, List data){ this.mCOntext= context; this.mData = data; } @Override public int getCount() { return mData.size(); } @Override public T getItem(int position) { if(checkPositionIsOutOfRange(position)){ return null; } return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public abstract View getView(int position, View convertView, ViewGroup parent); public void refresh(List data){ if(data == null){ this.mData.clear(); }else{ this.mData = data; } notifyDataSetChanged(); } public boolean checkPositionIsOutOfRange(int position){ if(0 <= position && position  getData(){ return mData; } } 

这个SimpleAdapter实现了数据基于List的最基本方法的实现,使得每次继承BaseAdapter不用再实现一些基本的方法,接下来再看一下用于更好实现分组的Adapter的进一步封装:

 public abstract class SortAdapter extends SimpleAdapter { public final static int VIEW_TYPE_GROUP = 0; public final static int VIEW_TYPE_CHILD = 1; private HashMap mKeyIndex = new HashMap<>(); public SortAdapter(Context context, Map> map) { init(context, convertMapToList(map)); } public SortAdapter(Context context, List list) { init(context, list); } /** * 转换分组数据为List,并且更新键值的索引 * @param map * @return */ public List convertMapToList(Map> map) { List mData = new ArrayList<>(); mKeyIndex.clear(); for (Map.Entry> entry : map.entrySet()) { mData.add(entry.getKey()); mKeyIndex.put(entry.getKey(), mData.size() - 1); for (V v : entry.getValue()) { mData.add(v); } } return mData; } public void refresh(Map> map) { super.refresh(convertMapToList(map)); } @Override public void refresh(List data) { super.refresh(data); mKeyIndex.clear(); } /** * 得到键值的索引值 * @param k * @return */ public int getKeyIndex(K k){ Integer integer = mKeyIndex.get(k); if(integer == null){ return getKeyIndexFromList(k); } return integer; } public int getKeyIndexFromList(K k){ for(int i = 0; i  

本项目Github地址(基于AndroidStudio构建):
https://github.com/yuhengye/LetterSort

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

内容推荐:免费高清PNG素材下载
吐了个 "CAO" !
扫码关注 PHP1 官方微信号
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4