自己用着M1S,感觉里面的联系人姓氏提示功能不错,用起来挺好的,就自己做了个比较简单的类似于这样的功能,代码如下:
package com.fnd.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv_displayfamilyname;
private ListView lv_displaylinkman;
private String[] linkmanStrings = new String[] { "涂bing", "刘", "张fa", "徐",
"美", "郭", "王", "赵", "燕", "平三", "汗", "好哈", "新", "涂", "二", "三", "八戒",
"猴哥", "钟", "雨", "填", "张", "涂", "刘", "张", "徐", "美", "郭", "王", "赵",
"燕", "平", "汗", "好哈", "新", "涂", "二", "三", "八戒", "猴哥", "钟", "雨", "填",
"张", "涂", "刘", "张", "徐", "美", "郭", "王", "赵", "燕", "平", "汗", "好哈",
"新", "涂", "二", "三", "八戒", "猴哥", "钟", "雨", "填", "张" };
private String firstdisplaystring;
private boolean isshowing;
private String predisplaystring;
private Runnable displayrunnable;
private int displaycount = 0;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_displayfamilyname = (TextView) findViewById(R.id.tv_displayfamilyname);
lv_displaylinkman = (ListView) findViewById(R.id.lv_displaylinkman);
//给ListView添加一个滚动监听器
lv_displaylinkman
.setOnScrollListener(new DisplayLinkmanOnScrollListener());
List<Map<String, Object>> stringlist = new ArrayList<Map<String, Object>>();
for (String str : linkmanStrings) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", str);
stringlist.add(map);
}
ListItemAdapter lia = new ListItemAdapter(MainActivity.this,
stringlist, R.layout.ll_lvdisplaylinkman_item,
new String[] { "name" }, new int[] { R.id.tv_item });
lv_displaylinkman.setAdapter(lia);
tv_displayfamilyname.setVisibility(View.INVISIBLE);
displayrunnable = new DisplayRunnable();
}
final class DisplayLinkmanOnScrollListener implements OnScrollListener {
//存储当前屏最上层Item在ListView中的位置
private int firstVisibleItem = 0;
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.firstVisibleItem = firstVisibleItem;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE://当滑动停止
// 提取出姓氏(当前屏中间Item)
firstdisplaystring = linkmanStrings[firstVisibleItem
+ displaycount / 2].substring(0, 1);
if (!isshowing && !firstdisplaystring.equals(predisplaystring)) {
tv_displayfamilyname.setVisibility(View.VISIBLE);
isshowing = true;
}
tv_displayfamilyname.setText(firstdisplaystring);
//移除当前消息队列Runnable
handler.removeCallbacks(displayrunnable);
//添加新的消息队列Runnable
handler.postDelayed(displayrunnable, 2000);
break;
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
final class DisplayRunnable implements Runnable {
@Override
public void run() {
isshowing = false;
tv_displayfamilyname.setVisibility(View.INVISIBLE);
}
}
final class ListItemAdapter extends SimpleAdapter {
LayoutInflater mInflater;
List<Map<String, Object>> stringlist;
public ListItemAdapter(Context context,
List<Map<String, Object>> stringlist, int resource,
String[] from, int[] to) {
super(context, stringlist, resource, from, to);
mInflater = LayoutInflater.from(context);
this.stringlist = stringlist;
}
@Override
public int getCount() {
return super.getCount();
}
@Override
public Object getItem(int position) {
return super.getItem(position);
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(
R.layout.ll_lvdisplaylinkman_item, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.tv_item);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
System.out.println("position:" + position);
System.out.println("stringlist size:" + stringlist.size());
int lv_height = lv_displaylinkman.getHeight();
int item_height = convertView.getHeight();
System.out.println("lv_height:" + lv_height);
System.out.println("item_height:" + item_height);
// 算出手机一屏显示ListView Item的个数
if (item_height != 0) {
displaycount = lv_height / item_height;
}
holder.name.setText((String) stringlist.get(position).get("name"));
return convertView;
}
}
static class ViewHolder {
TextView name;
}
}
上面只实现了非常简单的功能,有兴趣的话可以实现非常丰富的功能。