先看看图片效果,我的是来源于网上资料的改进,希望帮助对这方面有需要的的朋友
直接上图上代码,就不解释了,最底部有代码下载链接,想要的童鞋就去下吧
下载地址:http://download.csdn.net/detail/touchsnow/5349469
实现的功能:混合字符串处理 中英文排序 右侧悬浮栏 顶部名称提示栏 滚动悬浮提示
图
一 右侧字母表工具
package com.zuo.quickaction; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * 右侧字母表,快速定位 * * @author zuo * @email 782287169@qq.com */ public class QuickLocationRightTool extends View { private String[] b = null; public void setB(String[] b) { this.b = b; } OnTouchingLetterChangedListener onTouchingLetterChangedListener; int choose = -1; Paint paint = new Paint(); boolean showBkg = false; public QuickLocationRightTool(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public QuickLocationRightTool(Context context, AttributeSet attrs) { super(context, attrs); } public QuickLocationRightTool(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showBkg) { canvas.drawColor(Color.parseColor("#10000000")); } int height = getHeight(); int width = getWidth(); int singleHeight = height / b.length; for (int i = 0; i < b.length; i++) { paint.setColor(Color.BLACK); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(true); if (i == choose) { paint.setColor(Color.parseColor("#3399ff")); paint.setFakeBoldText(true); } float xPos = width / 2 - paint.measureText(b[i]) / 2; float yPos = singleHeight * i + singleHeight; canvas.drawText(b[i], xPos, yPos, paint); paint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); final int oldChoose = choose; final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c = (int) (y / getHeight() * b.length); //字母位置 switch (action) { case MotionEvent.ACTION_DOWN: showBkg = true; if (oldChoose != c && listener != null) { if (c > 0 && c <= b.length) { //如果第一个字母是#,无效点击的话,条件变为c>0 listener.onTouchingLetterChanged(b[c]); choose = c; //处理重复 invalidate(); } } break; case MotionEvent.ACTION_MOVE: if (oldChoose != c && listener != null) { if (c > 0 && c <= b.length) { //如果第一个字母是#,无效点击的话,条件变为c>0 listener.onTouchingLetterChanged(b[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1; invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnTouchingLetterChangedListener( OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } public interface OnTouchingLetterChangedListener { public void onTouchingLetterChanged(String s); } }
二 分组排序的列表适配器
package com.zuo.quickaction; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author zuo * 列表适配器 */ public class QuickLocationListAdapter extends BaseAdapter { private LayoutInflater layoutInflater; private OnClickListener onClickListener; private String[] stringArr; private Map<String, String> map = new HashMap<String, String>(); public QuickLocationListAdapter(Context context, String[] arr, OnClickListener listener, Map<String, String> map) { layoutInflater = LayoutInflater.from(context); this.onClickListener = listener; stringArr = arr; this.map = map; } public int getCount() { return stringArr == null ? 0 : stringArr.length; } public Object getItem(int position) { if (stringArr != null) { String string = map.get(stringArr[position]); return string; } return null; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.firstCharHintTextView = (TextView) convertView .findViewById(R.id.text_first_char_hint); holder.nameTextView = (TextView) convertView.findViewById(R.id.text_website_name); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.nameTextView.setText(map.get(stringArr[position])); int idx = position - 1; char previewChar = idx >= 0 ? stringArr[idx].charAt(0) : ' '; //前一个字符 char currentChar = stringArr[position].charAt(0); //当前字符 if (currentChar != previewChar) { //如果不相等时显示 if (isWord(currentChar)) { if (position != 0) { holder.firstCharHintTextView.setVisibility(View.VISIBLE); } else { holder.firstCharHintTextView.setVisibility(View.GONE); } holder.firstCharHintTextView.setText(String.valueOf(currentChar)); } else { if (isWord(previewChar)) { holder.firstCharHintTextView.setVisibility(View.VISIBLE); holder.firstCharHintTextView.setText("*"); } else { holder.firstCharHintTextView.setVisibility(View.GONE); } } } else { holder.firstCharHintTextView.setVisibility(View.GONE); } return convertView; } public final class ViewHolder { public TextView firstCharHintTextView; public TextView nameTextView; } public boolean isWord(char c) { Pattern pattern = Pattern.compile("^[A-Za-z]+$"); Matcher isNum = pattern.matcher(String.valueOf(c)); if (!isNum.matches()) { return false; } else { return true; } } }
三 主函数
package com.zuo.quickaction; import android.app.Activity; import android.content.Context; import android.graphics.PixelFormat; import android.os.Bundle; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.*; import android.widget.AdapterView.OnItemClickListener; import com.zuo.quickaction.QuickLocationRightTool.OnTouchingLetterChangedListener; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author zuowen * @time 2013.05.08 * @email 782287169@qq.com * <p/> * 混合字符串处理 中英文排序 右侧悬浮栏 顶部名称提示栏 滚动悬浮提示 */ public class QuickLocationMainActivity extends Activity implements ListView.OnScrollListener, OnItemClickListener, android.view.View.OnClickListener { private QuickLocationRightTool letterListView; private Handler handler; private DisapearThread disapearThread; private int scrollState; private QuickLocationListAdapter quickLocationListAdapter; private ListView listMain; private TextView txtOverlay, title; private WindowManager windowManager; private String[] stringArr = {"ai", "zuo", "wn", "g黄真伊", "he河智苑", "@", "&&*(*", "
转载于:https://blog.51cto.com/makeapp628/1361235