读书人

联系人字母目录实现

发布时间: 2012-11-04 10:42:42 作者: rapoo

联系人字母索引实现

字母索引实现方式主要是通过Adapter继承 SectionIndexer接口,如下

public class HeaderAdapter extends ArrayAdapter<String> implements SectionIndexer {private List<String> items=new ArrayList<String>();private LayoutInflater mInflater;private int resource;private int textViewResourceId;private String[] sections;private HashMap<String,Integer> maps=new HashMap<String, Integer>();public HeaderAdapter(Context context, int resource, int textViewResourceId,List<String> items) {super(context, resource, textViewResourceId, items);this.items=items;mInflater=LayoutInflater.from(context);this.resource=resource;this.textViewResourceId=textViewResourceId;//A-Z字母列表sections=context.getResources().getStringArray(R.array.sections);initMaps();// TODO Auto-generated constructor stub}private void initMaps(){
        //遍历数据源,用来保存相应字母的position位置
for (int i=0;i<items.size();i++) {String start=items.get(i).substring(0,1).toUpperCase();if(!maps.containsKey(start)){                          maps.put(start, i);       }}}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn items.size();}@Overridepublic String getItem(int position) {// TODO Auto-generated method stubreturn items.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn super.getItemId(position);}@Overridepublic int getPosition(String item) {// TODO Auto-generated method stubreturn super.getPosition(item);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubconvertView =mInflater.inflate(resource, null);TextView textView=(TextView)convertView.findViewById(textViewResourceId);TextView header=(TextView)convertView.findViewById(R.id.header);String text=items.get(position);String start=text.substring(0, 1).toUpperCase();    if(maps.containsKey(start)&&maps.containsValue(position)){    header.setVisibility(View.VISIBLE);    header.setText(start);    }textView.setText(text);return convertView;}public int getPositionForSection(int sectionIndex) {// TODO Auto-generated method stub
//主要方法根据字母索引位置,获取需要滚动的position位置
       if(maps.get(sections[position])==null){       return -1;       }return maps.get(sections[sectionIndex]);}public int getSectionForPosition(int position) {// TODO Auto-generated method stubreturn 0;}public String[] getSections() {// TODO Auto-generated method stubreturn sections;}}

2.自定义SearchBar,实现字母索引

public class SearchBar extends View {    private String[] section;    private int height;
 
    private int indexHeight;//    private Paint textPaint;    private int width;    private int sectionLength;    private int curSetion;    private Rect mIndicatorRect = new Rect();    private Drawable mIndicatorDrawable;    private SectionIndexer mIndexer;    private ListView mList;    private PopupWindow mPopupWindow;    private TextView mPromptText;public SearchBar(Context context) {this(context,null);// TODO Auto-generated constructor stub}public SearchBar(Context context,AttributeSet attr) {this(context,attr,0);// TODO Auto-generated constructor stub}public SearchBar(Context context,AttributeSet attr,int def) {super(context,attr,0);// TODO Auto-generated constructor stub
//A-Z
section=getResources().getStringArray(R.array.sections);    sectionLength=section.length;textPaint=new Paint();textPaint.setColor(Color.BLACK);textPaint.setTextSize(14);mIndicatorDrawable = getResources().getDrawable(R.drawable.bladeview_indicator_normal);mPromptText=(TextView)LayoutInflater.from(context).inflate(R.layout.popup_text, null);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);     int offsetX=0;            mIndicatorRect.set(offsetX, indexHeight*curSetion, width,                 indexHeight*(curSetion+1));          mIndicatorDrawable.setBounds(mIndicatorRect);          mIndicatorDrawable.draw(canvas);           for (int i=0;i<section.length;i++) { canvas.drawText(section[i], width/2, (i+1)*indexHeight, textPaint); }}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);height=getHeight();width=getWidth();indexHeight=height/section.length;}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction()) {case MotionEvent.ACTION_DOWN:float y=event.getY();curSetion=getIndex(y);setPromptText(curSetion);showPopupWindows();int position=0;if(mIndexer!=null){ position=mIndexer.getPositionForSection(curSetion);   mList.setSelectionFromTop(position, 0);}break; case MotionEvent.ACTION_MOVE:      y=event.getY();curSetion=getIndex(y);setPromptText(curSetion);showPopupWindows();  position=0;if(mIndexer!=null){position=mIndexer.getPositionForSection(curSetion);  mList.setSelectionFromTop(position, 0);}invalidate();break;  case MotionEvent.ACTION_UP:  case MotionEvent.ACTION_CANCEL:  disMissPopupWindows();break;default:break;}return true;}//根据触摸Y值获取字母Index
private int getIndex(float y){for (int i = 1; i <sectionLength; i++) {if(y>i*indexHeight&&y<(i+1)*indexHeight){return i;}}return 0;}    public void setListView(ListView list){    Adapter adapter=list.getAdapter();    if(adapter instanceof SectionIndexer){    mIndexer=(SectionIndexer)adapter;    mList=list;    }        }    private void setPromptText(int sec){    mPromptText.setText(section[sec]);        }    private void createPopupWindows(){    if(mPopupWindow==null){    mPopupWindow=new PopupWindow();    mPopupWindow.setContentView(mPromptText);    mPopupWindow.setHeight(LayoutParams.WRAP_CONTENT);    mPopupWindow.setWidth(LayoutParams.WRAP_CONTENT);    ColorDrawable d=new ColorDrawable(Color.TRANSPARENT);    mPopupWindow.setBackgroundDrawable(d);        }        }    private  void showPopupWindows(){    createPopupWindows();    mPopupWindow.showAtLocation(this, Gravity.CENTER, -1, -1);        }    private void disMissPopupWindows(){    mPopupWindow.dismiss();    }}

3.测试Activity

public class MainActivity extends Activity {private List<String> items=new ArrayList<String>();    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);       setContentView(R.layout.activity_main);       ListView list=(ListView)findViewById(R.id.listView1);       SearchBar bar=(SearchBar)findViewById(R.id.searchbar);              items.add("Action");       items.add("Adventure");       items.add("asg");       items.add("agf");       items.add("bdd");       items.add("ball");       items.add("call");       items.add("Documentary");       items.add("Foreign");       items.add("full");       items.add("History");       items.add("Independent");       items.add("Romance");       list.setAdapter(new HeaderAdapter(this, R.layout.listitem, R.id.items, items));       bar.setListView(list);        }    @Override    public boolean onCreateOptionsMenu(Menu menu) {      //  getMenuInflater().inflate(R.menu.activity_main, menu);        return true;    }}


4.效果图

联系人字母目录实现



读书人网 >移动开发

热点推荐