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