项目结构

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><FrameLayout
        android:layout_width="fill_parent"android:layout_height="fill_parent" ><ListView
            android:id="@+id/country_lvcountry"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="center"android:divider="@null" /><TextView
            android:id="@+id/dialog"android:layout_width="80.0dip"android:layout_height="80.0dip"android:layout_gravity="center"android:background="@drawable/corner_list_single_pressed"android:gravity="center"android:textColor="#ffffffff"android:textSize="30.0dip"android:visibility="invisible" /><com.example.contactdemo.SideBar
            android:id="@+id/sidrbar"android:layout_width="30.0dip"android:layout_height="fill_parent"android:layout_gravity="right|center" /></FrameLayout></LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:orientation="vertical" ><TextView
        android:id="@+id/catalog"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1.0"android:background="#E0E0E0"android:paddingBottom="5dip"android:paddingLeft="5dip"android:paddingTop="5dip"android:text="A"android:textColor="#454545" /><TextView
        android:id="@+id/title"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_gravity="center_vertical"android:layout_marginLeft="5dip"android:layout_weight="1.0"android:gravity="center_vertical"android:paddingBottom="10dip"android:paddingTop="10dip"android:text="hhhh"android:textColor="#336598" /></LinearLayout>

SideBar.java

package com.example.contactdemo;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;public class SideBar extends View {private TextView textDialog;private OnSelectChangeListener changeListener;// 26个字母public static String[] b = { "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;// 选中private Paint paint = new Paint();public SideBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public SideBar(Context context, AttributeSet attrs) {super(context, attrs);}public SideBar(Context context) {super(context);}public void setTextView(TextView textView) {this.textDialog = textView;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);int width = getWidth();int height = getHeight();int singleHeight = height / b.length;for (int i = 0; i < b.length; i++) {paint.setColor(Color.rgb(33, 65, 98));paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setAntiAlias(true);paint.setTextSize(20);// 选中状态if (i == choose) {paint.setColor(Color.parseColor("#3399ff"));paint.setFakeBoldText(true);}float x = width / 2 - paint.measureText(b[i]) / 2;float y = singleHeight * i + singleHeight;canvas.drawText(b[i], x, y, paint);paint.reset();}}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {int action = event.getAction();final float y = event.getY();// 点击y坐标int c = (int) (y / getHeight() * b.length);switch (action) {case MotionEvent.ACTION_UP:setBackgroundResource(R.color.alph);choose = -1;invalidate();if (textDialog != null)textDialog.setVisibility(View.INVISIBLE);break;default:setBackgroundColor(Color.parseColor("#28000000"));if (choose != c) {if (c >= 0 && c < b.length) {if (changeListener != null)changeListener.onSelectChange(b[c]);if (textDialog != null) {textDialog.setText(b[c]);textDialog.setVisibility(View.VISIBLE);}choose = c;invalidate();}}break;}return true;}public void setOnSelectChangeListener(OnSelectChangeListener listener) {this.changeListener = listener;}public interface OnSelectChangeListener {void onSelectChange(String letter);}
}

MyAdapter.java

package com.example.contactdemo;import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;public class MyAdapter extends BaseAdapter {private List<MyModel> list = null;private Context mContext;public MyAdapter(List<MyModel> list, Context mContext) {this.list = list;this.mContext = mContext;}public void updateListView(List<MyModel> list) {this.list = list;notifyDataSetChanged();}@Overridepublic int getCount() {return this.list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View view, ViewGroup parent) {ViewHolder viewHolder = null;final MyModel mContent = list.get(position);if (view == null) {viewHolder = new ViewHolder();view = LayoutInflater.from(mContext).inflate(R.layout.item, null);viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);viewHolder.tvLetter = (TextView) view.findViewById(R.id.catalog);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}// 根据position获取分类的首字母的Char ASCII值int section = getAsciiForPosition(position);// 如果当前位置等于该分类首字母的Char的位置 ,则认为是第一次出现if (position == getPositionFroAscii(section)) {viewHolder.tvLetter.setVisibility(View.VISIBLE);viewHolder.tvLetter.setText(mContent.getSortLetters());} else {viewHolder.tvLetter.setVisibility(View.GONE);}viewHolder.tvTitle.setText(this.list.get(position).getName());return view;}/*** 根据位置转成首字母的ASCII* * @param position* @return*/public int getAsciiForPosition(int position) {int a = list.get(position).getSortLetters().charAt(0);return a;}/*** 根据字母的ASCII获取位置* * @param ascii* @return*/public int getPositionFroAscii(int ascii) {for (int i = 0; i < list.size(); i++) {String abc = list.get(i).getSortLetters();char firstChar = abc.toUpperCase().charAt(0);if (firstChar == ascii)return i;}return -1;}class ViewHolder {TextView tvLetter;TextView tvTitle;}
}

MainActivity.java

package com.example.contactdemo;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;import com.example.contactdemo.SideBar.OnSelectChangeListener;import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {private SideBar sideBar;private TextView dialog;private ListView sortListView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sideBar = (SideBar) findViewById(R.id.sidrbar);dialog = (TextView) findViewById(R.id.dialog);sortListView = (ListView) findViewById(R.id.country_lvcountry);sideBar.setTextView(dialog);List<MyModel> datas = getDatas(getResources().getStringArray(R.array.data));Collections.sort(datas, new Comparator<MyModel>() {// -1代表o1里的某一个属性比o2的小 0代表等于 1代表大于@Overridepublic int compare(MyModel o1, MyModel o2) {if (o1.getSortLetters().equals("#"))return 1;else if (o2.getSortLetters().equals("#"))return -1;elsereturn o1.getSortLetters().compareTo(o2.getSortLetters());}});final MyAdapter adapter = new MyAdapter(datas, this);sortListView.setAdapter(adapter);sideBar.setOnSelectChangeListener(new OnSelectChangeListener() {@Overridepublic void onSelectChange(String letter) {int ascii = letter.charAt(0);int position = adapter.getPositionFroAscii(ascii);if(position!=-1)sortListView.setSelection(position);}});}private List<MyModel> getDatas(String[] array) {List<MyModel> datas = new ArrayList<MyModel>();for (int i = 0; i < array.length; i++) {MyModel sortModel = new MyModel();sortModel.setName(array[i]);String abc = CharacterParser.getInstance().getSelling(array[i]);String sortString = abc.substring(0, 1).toUpperCase();// 正则表达式if (sortString.matches("[A-Z]")) {sortModel.setSortLetters(sortString);} else {sortModel.setSortLetters("#");}datas.add(sortModel);}return datas;}
}

源码下载

Android 仿微信联系人Demo相关推荐

  1. android 仿微信联系人 首字母分组快速索引

    总结是一种习惯,不能停,一停人就懒了,都快一个月没有写了!该提提神了! 进入正题:android 仿微信联系人 首字母快速索引,先用下美团的索引效果图: 1.自定义View字母索引栏(右边那一列): ...

  2. android 通讯录字母排序,Android仿微信联系人字母排序效果

    本文实例为大家分享了Android联系人字母排序的具体代码,供大家参考,具体内容如下 实现思路:首先说下布局,整个是一个相对布局,最下面是一个listview,listview上面是一个自定义的vie ...

  3. android仿微信联系人索引列表

    前言   因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果.本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太 ...

  4. android 通讯录界面设计带字母,android仿微信联系人索引列表功能

    前言 因为自己在做的一个小软件里面需要用到从A-Z排序的ListView,所以自然而然的想到了微信的联系人,我想要的就是那样的效果.本来没打算自己去写,想要第三方写好的东西,搜了几个之后发现有的太复杂 ...

  5. Android仿微信添加联系人列表,内附有截图和demo源码

    最新demo地址,仿微信添加联系人WXAddPersonDemo 分享一个Android仿微信选择联系人页面 之前做的App主要是工具类的,而且公司的产品经理也喜欢在App里设计很多自定义控件,所以比 ...

  6. android 仿微信demo————微信通讯录界面功能实现(移动端,服务端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

  7. android 仿微信demo————注册功能完善添加头像功能(服务端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

  8. android 仿微信demo——持续更新(实现移动端,服务端)

    仿微信UI设计,移动端用android studio写,服务端用idea. 主要功能包括注册登录功能,微信主界面(包含微信消息界面,联系人界面,发现界面,个人信息界面),聊天窗口,朋友圈. andro ...

  9. android 仿微信demo————登录功能实现(服务端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

最新文章

  1. 硬件丨十大人工智能芯片厂商
  2. Java 理论与实践: 非阻塞算法简介
  3. ORBSLAM2在Ubuntu14.04上详细配置流程
  4. python中0xf2_python入门(一)
  5. Java内存模型_基础
  6. 用 WebClient.UploadData 方法 上载文件数据
  7. npm package.json 文件基础知识
  8. 更自由的阿里云API工具JCLI
  9. 惠州物联网产业规模 明年争取达400亿元
  10. 【NOIP提高】飞扬的小鸟
  11. 冷藏温度范围_冷藏和冷冻的温度标准
  12. 牛客刷题记录之语法入门选择结构篇
  13. Windows Mobile下的重力感应器(Gravitational Sensor)开发
  14. 更改WSL Docker 镜像目录 减少C盘占用
  15. php file_get_contents路径问题,file_get_contents与相对路径
  16. Vue2学习笔记1 - win10下安装vue开发环境
  17. 【WPF】后台切换前台图片
  18. acm总结——多源BFS
  19. 详解C盘Windows文件夹里重要文件的作用
  20. 如何查看linux系统的状态,如何查看Linux和Mac机器的系统状态

热门文章

  1. pcb螺丝孔与螺丝大小_螺丝,螺栓和钉子之间的区别(以及何时应使用)
  2. 年会直播方案应该怎么做
  3. (15.1.14)Google正式发布Android L系统 剖析安卓5.0安卓L新特性
  4. wordpress修改地址后打不开_ip地址变了wordpress打不开
  5. android x86版本区分,Android X86 4.3(JB-x86)测试版本20130725发布
  6. CPU性能优化:Cache
  7. 怎样使用计算机的桌面助手,电脑桌面能使用mimikkoui吗?虚拟助手二次元桌面使用教程...
  8. ANDORID~支持的设备
  9. 2018年美国国内高校排名
  10. 玩转KVM:一招打开vm的console口