您的位置:首页 > 其它

通讯录索引条的功能实现

2016-01-01 19:43 393 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/nc_beiyun/article/details/50445669

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

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: