联系人快速检索实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32673327/article/details/52020685

这种快速检索的功能在很多app中都有应用;例如手机联系人的检索,微信中联系人的检索等等很多;

这里是MainActivity,布局文件没什么好说的;一个简单的布局而已;

public class MainActivity extends Activity {
private QuickIndexBar quickIndex;
private ListView listView;
private ArrayList<Friend> friends = new ArrayList<Friend>();
private TextView text;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
quickIndex = (QuickIndexBar) findViewById(R.id.quickIndex);
listView = (ListView) findViewById(R.id.listview);
text = (TextView) findViewById(R.id.text);
// 1.初始化数据
fillList();
// 2.对数据进行排序
Collections.sort(friends);
// 3.添加数据适配器
listView.setAdapter(new MyAdapter(this, friends));
quickIndex.setOnTouchLetterListener(new OnTouchLetterListener() {


@Override
public void OnTouchLetter(String letter) {
// 根据触摸找到item方到屏幕顶端
for (int i = 0; i < friends.size(); i++) {
String firstWord = friends.get(i).getPinyin().charAt(0)
+ "";
if (firstWord.endsWith(letter)) {
// 当前的item方到屏幕顶端
listView.setSelection(i);
break;// 只需要找到第一个
}
}
showCurrentWord(letter);


}
});
// 缩小text隐藏
ViewHelper.setScaleX(text, 0);
ViewHelper.setScaleY(text, 0);


}


private boolean isScale=false;
private Handler handler = new Handler();


protected void showCurrentWord(String letter) {
text.setText(letter);
if (!isScale) {
isScale=true;
ViewPropertyAnimator.animate(text).scaleX(1f)
.setInterpolator(new OvershootInterpolator())
.setDuration(450).start();
ViewPropertyAnimator.animate(text).scaleY(1f)
.setInterpolator(new OvershootInterpolator())
.setDuration(450).start();

}


// 先移除之前的任务
handler.removeCallbacksAndMessages(null);
// 延时隐藏
handler.postDelayed(new Runnable() {


@Override
public void run() {
// 缩小text隐藏
ViewPropertyAnimator.animate(text).scaleX(0f)
.setInterpolator(new OvershootInterpolator())
.setDuration(450).start();
ViewPropertyAnimator.animate(text).scaleY(0f)
.setInterpolator(new OvershootInterpolator())
.setDuration(450).start();




}
}, 1500);
isScale = true;
}


private void fillList() {
// 虚拟数据
friends.add(new Friend("李伟"));
friends.add(new Friend("张三"));
friends.add(new Friend("阿三"));
friends.add(new Friend("阿四"));
friends.add(new Friend("段誉"));
friends.add(new Friend("段正淳"));
friends.add(new Friend("张三丰"));
friends.add(new Friend("陈坤"));
friends.add(new Friend("林俊杰1"));
friends.add(new Friend("陈坤2"));
friends.add(new Friend("王二a"));
friends.add(new Friend("林俊杰a"));
friends.add(new Friend("张四"));
friends.add(new Friend("林俊杰"));
friends.add(new Friend("王二"));
friends.add(new Friend("王二b"));
friends.add(new Friend("赵四"));
friends.add(new Friend("杨坤"));
friends.add(new Friend("赵子龙"));
friends.add(new Friend("杨坤1"));
friends.add(new Friend("李伟1"));
friends.add(new Friend("宋江"));
friends.add(new Friend("宋江1"));
friends.add(new Friend("李伟3"));
}


}

这里是重点,也就是自定义了一个控件来实现我们需要的快速检索的效果;

public class QuickIndexBar extends View {
private String[] indexArr = { "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;
private int width;
private float cellHeight;


public QuickIndexBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}


public QuickIndexBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();


}


public QuickIndexBar(Context context) {
super(context);
init();


}


private void init() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 设置抗锯齿
paint.setColor(Color.WHITE);
paint.setTextSize(16);
paint.setTextAlign(Align.CENTER);// 设置文本的起点是文字边框底边的中心
}


@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
width = getMeasuredWidth();
cellHeight = getMeasuredHeight() * 1f / indexArr.length;// 一个格子高度
}


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < indexArr.length; i++) {
float x = width / 2;
float y = cellHeight / 2 + getTextHeight(indexArr[i]) / 2 + i
* cellHeight;
paint.setColor(lastIndex==i?Color.BLACK:Color.WHITE);
canvas.drawText(indexArr[i], x, y, paint);
}


}


private int lastIndex = -1;// 上次触摸的索引


@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
float y = event.getY();
int index = (int) (y / cellHeight);
if (lastIndex != index) {
// Log.i("MyDebug", indexArr[index]);
// 安全性检查
if (index >= 0 && index < indexArr.length) {
if (listener != null) {
listener.OnTouchLetter(indexArr[index]);
}
}


}
lastIndex = index;
break;
case MotionEvent.ACTION_UP:
lastIndex = -1;
break;


default:
break;
}
// 引起重绘
invalidate();
return true;
}


/**
* @param text
* @return 文本的高度
*/
private int getTextHeight(String text) {
Rect bounds = new Rect();
paint.getTextBounds(text, 0, text.length(), bounds);
return bounds.height();
}


public OnTouchLetterListener listener;


public void setOnTouchLetterListener(OnTouchLetterListener listener) {
this.listener = listener;
}


/**
* @author Administrator触摸字母监听器

*/
public interface OnTouchLetterListener {
void OnTouchLetter(String letter);
}

这里是Listview的适配器:

package com.example.checkout;


import java.util.ArrayList;


import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter{
private Context context;
private ArrayList<Friend> list;
public MyAdapter(Context context,ArrayList<Friend> list) {
super();
this.context = context;
this.list = list;
}


@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView = View.inflate(context, R.layout.adapter_friend,null);
}

ViewHolder holder = ViewHolder.getHolder(convertView);
//设置数据
Friend friend = list.get(position);
holder.name.setText(friend.getName());

String currentWord = friend.getPinyin().charAt(0)+"";
if(position>0){
//获取上一个item的首字母
String lastWord = list.get(position-1).getPinyin().charAt(0)+"";
//拿当前的首字母和上一个首字母比较
if(currentWord.equals(lastWord)){
//说明首字母相同,需要隐藏当前item的first_word
holder.first_word.setVisibility(View.GONE);
}else {
//不一样,需要显示当前的首字母
//由于布局是复用的,所以在需要显示的时候,再次将first_word设置为可见
holder.first_word.setVisibility(View.VISIBLE);
holder.first_word.setText(currentWord);
}
}else {
holder.first_word.setVisibility(View.VISIBLE);
holder.first_word.setText(currentWord);
}

return convertView;
}


static class ViewHolder{
TextView name,first_word;

public ViewHolder(View convertView){
name = (TextView) convertView.findViewById(R.id.name);
first_word = (TextView) convertView.findViewById(R.id.first_word);
}
public static ViewHolder getHolder(View convertView){
ViewHolder holder = (ViewHolder) convertView.getTag();
if(holder==null){
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
return holder;
}
}
}

最后总结一下,其实实现这个效果主要有两点,一个是自定义控件来实现我们所需要的界面效果,在一个就是用到了一个工具类,这个工具类中可以对拼音的首字母进行处理,以达到我们需要的那种效果;

附上下载链接:http://download.csdn.net/detail/qq_32673327/9584545

猜你喜欢

转载自blog.csdn.net/qq_32673327/article/details/52020685
今日推荐