39、微信通讯录联系人快速索引侧边栏SideBar

来源:互联网 发布:手机淘宝地址在哪改 编辑:程序博客网 时间:2024/05/05 11:26
首先参考《36、微信通讯录页面》中SideBar的布局代码,这里看实现代码:
public class SideBar extends View {
private char[] l;
private SectionIndexer sectionIndexter = null;
private ListView list;
private TextView mDialogText;
private int m_nItemHeight = Utils.dipToPixel(getContext(), 15);

public SideBar(Context context) {
super(context);
init();
}

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

private void init() {
l = new char[] { '#', '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' };
}

public SideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

public void setListView(ListView _list) {
list = _list;
}

public void setTextView(TextView mDialogText) {
this.mDialogText = mDialogText;
}

public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
int i = (int) event.getY();
int idx = i / m_nItemHeight;
if (idx >= l.length) {
idx = l.length - 1;
} else if (idx < 0) {
idx = 0;
}
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
mDialogText.setVisibility(View.VISIBLE);
mDialogText.setText("" + l[idx]);
if (sectionIndexter == null) {
HeaderViewListAdapter ha = (HeaderViewListAdapter) list.getAdapter();
sectionIndexter = (SectionIndexer) ha.getWrappedAdapter();
}
int position = sectionIndexter.getPositionForSection(l[idx]);
if (position == -1) {
return true;
}
list.setSelection(position);
} else {
mDialogText.setVisibility(View.INVISIBLE);
}
return true;
}

protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(getResources().getColor(R.color.gray));
paint.setTextSize(Utils.dipToPixel(getContext(), 12));
// paint.setTextSize(20);
// paint.setColor(0xff595c61);
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
paint.setTypeface(font);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setTextAlign(Paint.Align.CENTER);
float widthCenter = getMeasuredWidth() / 2;
for (int i = 0; i < l.length; i++) {
canvas.drawText(String.valueOf(l[i]), widthCenter, m_nItemHeight + (i * m_nItemHeight), paint);
}
super.onDraw(canvas);
}
}
mDialogText是当用手点击或者滚动侧边栏时,屏幕中央会显示的大写字母的视窗:
mDialogText = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.list_position, null);
<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"
android:textSize="50sp"
android:textColor="@android:color/white"
android:minWidth="70dip"
android:maxWidth="70dip"
android:padding="10dip"
android:gravity="center"
android:background="@drawable/btn_bg_green"
/>

list就是外层通过代码设置的通讯录联系列表:
indexBar.setListView(lvContact);
当手点击或滚动侧边栏时,会通过操作list来对应的联系人:
list.setSelection(position);

0 0
原创粉丝点击