先看看图片效果,我的是来源于网上资料的改进,希望帮助对这方面有需要的的朋友

直接上图上代码,就不解释了,最底部有代码下载链接,想要的童鞋就去下吧

下载地址: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河智苑", "@", "&&*(*", "