通讯录索引条的功能实现

来源:互联网 发布:java环境一键安装 编辑:程序博客网 时间:2024/06/03 01:35

之前要做索引条,从网上搜罗很多代码,都感觉比较麻烦,再次整理出相对简单的实现逻辑,以供参考:

1.适配器

package com.nc.worldshop.location;import java.util.ArrayList;import java.util.List;import com.nc.worldshop.R;import com.nc.worldshop.entity.City;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class ContentAdapter extends BaseAdapter {    private List<City> mCities;//保存city名称的集合    /**保存第一次出现索引值的城市名称*/    public List<String> mCityNames = new ArrayList<String>();    /**保存第一次出现的索引值*/    private StringBuilder mBuilder = new StringBuilder();    public ContentAdapter(List<City> cities) {        super();        this.mCities = cities;    }    @Override    public int getCount() {        return mCities.size();    }    @Override    public City getItem(int position) {        return mCities.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        CityHolder holder = null;        if(convertView == null){            holder = new CityHolder();            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.location_city_item, null);            holder.mCityName = (TextView) convertView.findViewById(R.id.location_city_item_cityName);            holder.mSortKey = (TextView) convertView.findViewById(R.id.location_city_item_sortKey);            convertView.setTag(holder);        } else {            holder = (CityHolder) convertView.getTag();        }        City city = getItem(position);        String cityName = city.getName();        String sortKey = city.getSortKey();        //判断key是否是第一次出现        if(mBuilder.indexOf(sortKey) == -1){            //如果是第一次出现,就保存该城市的首字母            mBuilder.append(sortKey);            //保存第一次出现的索引的城市名字,因为城市名称是            //唯一的以便我们后续通过名字找到对应的城市            mCityNames.add(cityName);        }        //第一次出现的城市显示索引值        if(mCityNames.contains(cityName)){            holder.mSortKey.setVisibility(View.VISIBLE);            holder.mSortKey.setText(sortKey);        } else {            holder.mSortKey.setVisibility(View.GONE);        }        holder.mCityName.setText(cityName);        return convertView;    }    class CityHolder {        TextView mCityName;//城市名        TextView mSortKey;//首字母    }}

2.自定义view,这是实现索引条的关键,我们要在这里绘制索引条
package com.nc.worldshop.location;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;

/*绘制索引条/
public class IndexScrollBar extends View {

private String[] s = {        "定位","热门","全部","A","B","C","D","E",        "F","G","H","I","G","K","L","M","N","O","P",        "Q","R","S","T","U","V","W","X","Y","Z"};private int height;private int size;private Paint paint;public interface OnWordSelectedListenner{    void selectedListenner(String word);}private OnWordSelectedListenner listener;public void setOnWordSelectedListenner(OnWordSelectedListenner listenner) {    this.listener = listenner;}public IndexScrollBar(Context context) {    this(context,null);}public IndexScrollBar(Context context, AttributeSet attrs, int defStyle) {    super(context, attrs, defStyle);    //初始化画笔    paint = new Paint();    int size = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics());    paint.setTextSize(size);    paint.setColor(Color.parseColor("#666666"));    paint.setAntiAlias(true);}public IndexScrollBar(Context context, AttributeSet attrs) {    this(context, attrs,0);}private int last = -1;@Overridepublic boolean onTouchEvent(MotionEvent event) {    switch (event.getAction()) {    case MotionEvent.ACTION_DOWN:    case MotionEvent.ACTION_MOVE:        setBackgroundColor(Color.parseColor("#44000000"));        if(listener!=null){            //手指按下            float y = event.getY();            int index = (int) (y/height*size);            if(index>=0&&index!=last){                listener.selectedListenner(String.valueOf(s[index]));                last = index;            }        }        break;    case MotionEvent.ACTION_UP:        setBackgroundColor(Color.parseColor("#00000000"));        //手指离开        if(listener!=null){            listener.selectedListenner(null);        }        break;    }    return true;}@Overrideprotected void onDraw(Canvas canvas) {    super.onDraw(canvas);    int width = getWidth();    height = getHeight();    int each = height/s.length;    size = s.length;    for (int i = 0; i < size; i++) {        String w = String.valueOf(s[i]);        float size = paint.measureText(w);        float x = (width-size)/2;        canvas.drawText(w, x, (i+1)*each, paint);    }

}

}
通过自定义view的回调在主页面里面就可以获得当前点击的
字母或文字,然后就可以做一些操作了,下面附
上主要代码

/* 初始化地址菜单的索引条 /
private void initIndexScrollBar() {
scrollBar.setOnWordSelectedListenner(new OnWordSelectedListenner() {

        @Override        public void selectedListenner(String word) {            setIndexToView(word);// 把索引显示在textview            mApp.Log("word=" + word);            scrollToPositionOfLocation(word);// 将listview滚动到word所在的位置        }    });}/** 将listview滚动到word所在的位置 */protected void scrollToPositionOfLocation(String word) {    int len = mItems.size();    for (int i = 0; i < len; i++) {        if (mItems.get(i).getSortKey().equalsIgnoreCase(word)) {            mListView.smoothScrollToPosition(i);        } else if ("定位".equals(word)) {            mListView.smoothScrollToPosition(0);        } else if ("热门".equals(word)) {            mListView.smoothScrollToPosition(1);        } else if ("全部".equals(word)) {            mListView.smoothScrollToPosition(2);        }    }}/** 把索引显示在textview */private void setIndexToView(String word) {    scrollBarIndex.setVisibility(View.VISIBLE);    if (word != null)        scrollBarIndex.setText(word);    scrollBarIndex.postDelayed(new Runnable() {        @Override        public void run() {            scrollBarIndex.setVisibility(View.GONE);        }    }, 500);}
0 0
原创粉丝点击