仿联系人选择列表和美团城市选择器
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));
}
});
}
项目源码: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; }
相关文章推荐
- 仿美团实现地域选择和城市列表
- 源码推荐:仿美团城市选择器效果 MG选择相册(仿QQ空间选择照片)
- 源码推荐:仿美团城市选择器效果 MG选择相册(仿QQ空间选择照片),播放器横竖屏切换,DLPickerView
- Android 仿美团选择城市、微信通讯录、饿了么点餐列表的导航悬停分组索引列表
- 一个实现城市选择、联系人选择的库
- 微信小程序 仿美团城市选择 城市切换
- Android 城市列表选择控件
- Android 类似美团的选择城市界面
- 【Android】快速实现仿美团选择城市界面,微信通讯录界面
- CSS 多类选择器一个class值包含一个词列表,或分开包含时的选择
- 类似大众点评 58 美团 等应用的城市选择器 — Edit
- javascript城市选择器,jQuery.citypicker之后又一个清爽简洁的城市选择器插件,js城市选择器,js中国城市选择,城市选择js插件
- android 怎么调用联系人列表,并将选择的联系人号码显示在文本框里
- Android快速实现仿美团选择城市界面,微信通讯录界面
- jQuery城市选择器(仿51选择)
- 【javascript城市选择器】javascript城市选择器插件源码可以下载了
- MeiTuanLocateCity仿美团城市列表选择界面
- 设置手机联系人样式的城市列表
- Android城市选择列表(一)——RecyclerView数据分组
- MeiTuanLocateCity仿美团城市列表选择界面