您的位置:首页 > 其它

仿联系人选择列表和美团城市选择器

2017-03-27 15:08 344 查看
效果如图:


项目源码:https://github.com/Ahuanghaifeng/CitySelect

说明:采用的是本地格式化好的数据,采用的是listView+自定义view。

简单说下思路

主页布局文件是listview+最上面textview,监听listview的滑动,获取当前第一条数据的char,设置在textview上,item是两个textview,在adapter里面选择显不显示字母。

傍边26个字母是自定义view,可以在代码里面设置,不一定为26个字母。

核心代码如下:

private void setAdapter() {
SourceDateList = filledData(getResources().getStringArray(R.array.citys));
adapter = new SortAdapter(this, SourceDateList);
sortListView.setAdapter(adapter);
sortListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {

}

@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
char heads = SourceDateList.get(i).getSortLetters().charAt(0);
head.setText(String.valueOf(heads));
}
});
}
/**
* 格式化数据
* @param date
* @return
*/
private List<CitySortModel> filledData(String[] date) {
List<CitySortModel> mSortList = new ArrayList<>();
ArrayList<String> indexString = new ArrayList<>();
String key="";
for (int i = 0; i < date.length; i++) {
if (date[i].length()!=1){
CitySortModel sortModel = new CitySortModel();
sortModel.setSortLetters(key);
sortModel.setName(date[i]);
mSortList.add(sortModel);
}else if (date[i].length()==1){
key = date[i];
indexString.add(key);
}
}
sideBar.setIndexText(indexString);
return mSortList;
}
adapter里面的代码
public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
final CitySortModel mContent = list.get(position);
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.item_select_city, null);
viewHolder.tvTitle = (TextView) view.findViewById(R.id.tv_city_name);
view.setTag(viewHolder);
viewHolder.tvLetter = (TextView) view.findViewById(R.id.tv_catagory);
} else {
viewHolder = (ViewHolder) view.getTag();
}

int section = getSectionForPosition(position);

if (position == getPositionForSection(section)) {
viewHolder.tvLetter.setVisibility(View.VISIBLE);
viewHolder.tvLetter.setText(mContent.getSortLetters());
} else {
viewHolder.tvLetter.setVisibility(View.GONE);
}
viewHolder.tvTitle.setText(this.list.get(position).getName());

return view;

}

final static class ViewHolder {
TextView tvLetter;
TextView tvTitle;
}

public int getSectionForPosition(int position) {
return list.get(position).getSortLetters().charAt(0);
}

public int getPositionForSection(int section) {
for (int i = 0; i < getCount(); i++) {
String sortStr = list.get(i).getSortLetters();
char firstChar = sortStr.toUpperCase().charAt(0);
if (firstChar == section) {
return i;
}
}
return -1;
}
sidebar里面代码
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int height = getHeight();// 获取对应高度
int width = getWidth();// 获取对应宽度
int singleHeight = height / letterList.size();// 获取每一个字母的高度
for (int i = 0; i < letterList.size(); i++) {
paint.setColor(Color.parseColor("#606060"));
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAntiAlias(true);
paint.setTextSize(20);
// 选中的状态
if (i == choose) {
paint.setColor(Color.parseColor("#4F41FD"));
paint.setFakeBoldText(true);
}
// x坐标等于中间-字符串宽度的一半.
float xPos = width / 2 - paint.measureText(letterList.get(i)) / 2;
float yPos = singleHeight * i + singleHeight / 2;
canvas.drawText(letterList.get(i), xPos, yPos, paint);
paint.reset();// 重置画笔
}
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
final int action = event.getAction();
final float y = event.getY();// 点击y坐标
final int oldChoose = choose;
final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
final int c = (int) (y / getHeight() * letterList.size());// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.

switch (action) {
case MotionEvent.ACTION_UP:
//                setBackgroundColor(Color.parseColor("#F0F0F0"));
choose = -1;
invalidate();
if (mTextDialog != null) {
mTextDialog.setVisibility(View.GONE);
}
break;
default:
//                setBackgroundResource(R.drawable.sidebar_background);
if (oldChoose != c) {
if (c >= 0 && c < letterList.size()) {
if (listener != null) {
listener.onTouchingLetterChanged(letterList.get(c));
}
if (mTextDialog != null) {
mTextDialog.setText(letterList.get(c));
mTextDialog.setVisibility(View.VISIBLE);
}
choose = c;
invalidate();
}
}
break;
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息