通讯录索引条的功能实现

这篇博客分享了如何实现通讯录索引条的简洁方法,主要通过自定义View来绘制索引条,并提供了适配器和回调监听事件的关键代码,方便在主页面中获取并处理用户选择的字母。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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;

@Override
public 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;
}

@Override
protected 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值