天天看點

聯系人快速檢索實作

這種快速檢索的功能在很多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;

}

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;

}

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