如果给Contact的List加一个用字母排序的导航
来源:互联网 发布:日文拍照翻译软件 编辑:程序博客网 时间:2024/05/22 14:05
效果图:
这样写Layout:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:rcm="http://schemas.android.com/apk/res/com.ringcentral.android" android:id="@+id/contact_list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/bgColorMain" android:orientation="vertical" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent" android:divider="@null" android:listSelector="@drawable/bg_list_item_selector" /> <com.example.view.<strong>SectionIndexerView //这个是右边的导航</strong> android:id="@+id/section_indexer_view" android:layout_width="70dip" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginBottom="4dip" android:layout_marginRight="6dip" android:layout_marginTop="4dip" android:textSize="12.0sp" /> <<strong>TextView //这个是中间的字母提示</strong> android:id="@+id/section_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/section_text_bg" android:gravity="center" android:textColor="#FFFFFF" android:textSize="40sp" android:visibility="gone" /> </FrameLayout> <RelativeLayout android:id="@+id/no_contact_indication" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/emptyListText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:singleLine="true" android:text="No Contacts" android:textColor="@color/text_no_items" android:textSize="20sp" /> <ProgressBar android:id="@+id/loading" style="@style/RCMProgressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:visibility="gone" /> </RelativeLayout></LinearLayout>
关于SectionIndexerView 的写法:
public class SectionIndexerView extends View{ public static final String TAG = SectionIndexerView.class.getSimpleName(); private static final boolean DEBUG = true; /** 写文字的画笔 */ private Paint mTextPaint; /** 指定view的宽度 */ private int mViewWidth = 0; /** 指定view的高度 */ private int mViewHeight = 0; /** 每个文字的高度 */ private float mPerTextHeight; /** 是否是按下状态 */ private boolean mIsPressed = false; /** 关联的listview */ private ListView mListview = null; /** 关联的indexer */ private SectionIndexer mIndexer; /** 关联的textview */ private TextView mView = null; /** 按照A-Z排序的section */ private String[] mSectionIndexerText = { "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 static final float TEXTSIZE_RATIO = 0.84f; /** 默认的字体大小常量 */ private static final int CHAR_WIDTH = 12; /** 背景的透明度 */ private static final int BG_ALPHA = 153; /** 背景的圆角弧度 */ private static final float BG_RADIAN = 20f; /** 默认的字体大小 */ private int mCharwidth = CHAR_WIDTH; /** Context */ private Context mContext = null; /** * 构造函数 * * @param context * Context */ public SectionIndexerView(Context context) { super(context); init(context); } /** * 构造函数 * * @param context * Context * @param attributeSet * AttributeSet */ public SectionIndexerView(Context context, AttributeSet attributeSet) { super(context, attributeSet); init(context); } /** * 初始化基本信息 * * @param context * Context */ private void init(Context context) { mContext = context; mCharwidth = (int) (mCharwidth * mContext.getResources().getDisplayMetrics().density); this.mTextPaint = new Paint(); this.mTextPaint.setAntiAlias(true); this.mTextPaint.setColor(-1); } /** * 初始化SectionIndexer,指定listview,indexer及显示section的textview * * @param listview * 关联的listview * @param indexer * 关联的SectionIndexer * @param view * 关联的TextView */ public void init(ListView listview, SectionIndexer indexer, TextView view) { this.mListview = listview; this.mIndexer = indexer; this.mView = view; } @Override protected void onDraw(Canvas paramCanvas) { Paint localPaint = new Paint(); localPaint.setAntiAlias(true); this.mTextPaint.setColor(Color.parseColor("#75797d")); if (this.mIsPressed) { localPaint.setColor(Color.parseColor("#838a98")); localPaint.setAlpha(BG_ALPHA); } else { localPaint.setAlpha(0); } this.mTextPaint.setTextSize(this.mViewHeight * TEXTSIZE_RATIO / mSectionIndexerText.length); System.out.println("==textSize="+(this.mViewHeight * TEXTSIZE_RATIO / mSectionIndexerText.length)); System.out.println("====mViewWidth="+mViewWidth+"mCharWidth="+mCharwidth); //paramCanvas.drawRoundRect是画背景,BG_RADIAN为弯曲的弧度 paramCanvas.drawRoundRect(new RectF(50, 0.0F, this.mViewWidth, this.mViewHeight), BG_RADIAN, BG_RADIAN, localPaint); //这个textPointX为 int textPointX = 140; //textPointY为写text的Y的位置 float textPointY = (this.mPerTextHeight - this.mTextPaint.ascent()) / 2.0F; int sectionslength = this.mSectionIndexerText.length; int currentSection = 0; int currentHeight = 0; while (true) { if (currentSection >= sectionslength) { break; } //(mCharwidth - (int) this.mTextPaint.measureText(this.mSectionIndexerText[currentSection])) / 2 //这样写的原因是使每个字母居中对齐 paramCanvas.drawText( this.mSectionIndexerText[currentSection], textPointX + (mCharwidth - (int) this.mTextPaint .measureText(this.mSectionIndexerText[currentSection])) / 2, textPointY + (3.0F + currentHeight * this.mPerTextHeight), this.mTextPaint);// SUPPRESS CHECKSTYLE : magic number ++currentHeight; ++currentSection; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = View.MeasureSpec.getSize(widthMeasureSpec); this.mViewWidth = width; int height = View.MeasureSpec.getSize(heightMeasureSpec); this.mViewHeight = height; setMeasuredDimension(this.mViewWidth, this.mViewHeight); this.mPerTextHeight = (this.mViewHeight / this.mSectionIndexerText.length); } @Override public boolean onTouchEvent(MotionEvent motionEvent) { boolean returnvalue = false; switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: if (DEBUG) { Log.d(TAG, "action down!"); } mListview.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0)); returnvalue = processTouchEvent(motionEvent); break; case MotionEvent.ACTION_MOVE: if (DEBUG) { Log.d(TAG, "action move!"); } returnvalue = processTouchEvent(motionEvent); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (DEBUG) { Log.d(TAG, "action up!"); } setPressed(false); mView.setText(""); mView.setVisibility(View.GONE); returnvalue = true; break; default: break; } invalidate(); return returnvalue; } /** * 处理onTouch事件 * * @param motionEvent * MotionEvent * @return true 处理了触摸事件,false没有处理 */ private boolean processTouchEvent(MotionEvent motionEvent) { String selcected = ""; int backgroundPointX = this.mViewWidth - getPaddingRight() - mCharwidth * 3// SUPPRESS CHECKSTYLE - getPaddingLeft(); if (motionEvent.getX() < backgroundPointX) { mView.setVisibility(View.GONE); setPressed(false); return false; } setPressed(true); int curruntSection = (int) (motionEvent.getY() / this.mPerTextHeight); if (curruntSection >= 0 && curruntSection <= mSectionIndexerText.length - 1) { selcected = mSectionIndexerText[curruntSection]; mView.setVisibility(View.VISIBLE); } else { if (curruntSection < 0) { selcected = mSectionIndexerText[0]; } else if (curruntSection > mSectionIndexerText.length) { selcected = mSectionIndexerText[mSectionIndexerText.length - 1]; } mView.setVisibility(View.GONE); } boolean foundedPosition = false; for (int i = 0; i < mIndexer.getSections().length; i++) { SectionTitle title = (SectionTitle)mIndexer.getSections()[i]; if (selcected.equals(title.title)) { mListview.setSelection(mIndexer.getPositionForSection(i)); foundedPosition = true; break; } } if (foundedPosition) { mView.setBackgroundResource(R.drawable.section_text_bg); mView.setText(selcected); } else { mView.setBackgroundResource(R.drawable.section_text_gray_bg); mView.setText(selcected); } return true; } @Override public void setPressed(boolean pressed) { this.mIsPressed = pressed; }}
这样来初始化:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.contacts_list_content);mEmtytext = (TextView) findViewById(R.id.emptyListText);mLoadingBar = (ProgressBar) findViewById(R.id.loading);mQueryHandler = new MyHandler(this);mAdapter = new ContactsAdapter(this);mSectionIndexer = (SectionIndexerView)findViewById(R.id.section_indexer_view);TextView textView = (TextView)findViewById(R.id.section_text);getListView().setOnScrollListener(mAdapter);setListAdapter(mAdapter);<strong>mSectionIndexer.init(getListView(), mAdapter, textView);</strong>startQuery();}
代码:http://download.csdn.net/detail/baidu_nod/7810525
0 0
- 如果给Contact的List加一个用字母排序的导航
- 从outlook2003 获取contact list, 并添加新的contact
- 如果给网站title上加一个小图标
- 读技术书,最有效的手段是把例子亲手做一次,如果没有例子就按作者的意图给他加一个适当的例子......
- 给一个DIV的右上解加一个删除按钮
- MYSQL 一个巧用字符函数巧用字符函数做数据筛选的题
- 一个给图片生成缩略图和加版权的类
- 一个给图片生成缩略图和加版权的类
- 给自己的网站加一个搜索功能代码
- 给DataGrid加一个自动序列rowIndex的列
- 给XCODE加一个注释的小插件
- Android给Gallery处于中间的图片加一个背景图片
- 给XCODE加一个注释的小插件
- 给XCODE加一个注释的小插件
- 给DataGrid加一个自动序列rowIndex的列
- 遇到给ExtJS页面加一个合计行的问题
- 遇到给ExtJS页面加一个合计行的问题
- 给.dll文件加一个数字签名的方法
- C当中关于sizeof(struct)和sizeof(union)
- hdu 2793 矩阵快速幂
- jq select操作全集
- Android系统开发(5)——Eclipse for C/C++
- 成员对象和封闭类
- 如果给Contact的List加一个用字母排序的导航
- 图的遍历
- labwindows cvi串口采集数据与实时显示
- Ajax学习
- 最大似然估计
- hdu 4839 数位DP
- 状态压缩dp
- C++11之 unique_ptr
- STM32固件库中函数名的约定格式