通讯录索引条的功能实现
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); }
相关文章推荐
- 实现用数据库存储通讯录 实现“增删改查”的功能
- 用c语言实现 一个通讯录(实现 增加、删除、查找、修改、显示、清空功能)
- ios-day13-01(私人通讯录。控制器之间的数据传递、保存密码和自动登录的实现、普通对象的归档、UITableView的局部刷新和向左滑动删除功能等等)
- Android初级篇笔记-通讯录联想功能的实现
- 用链表实现的通讯录的功能
- vue实现通讯录功能
- C语言小功能实现--通讯录功能
- 基于链表实现一个简单通讯录功能
- vue 自定义组件实现通讯录功能
- Python编写通讯录通过数据库存储实现模糊查询功能
- C++程序学习之实现手机通讯录功能模拟
- 实现类似iPhone通讯录新增名片,保存,之后可进行编辑操作的功能
- iOS开发——高级技术&通讯录功能的实现
- php实现在线通讯录功能(附源码)
- 编写通讯录,实现以下四种功能
- 用C++容器vector实现通讯录功能
- 通讯录(链表实现,基本功能都有)
- 汇编实现的简单的通讯录系统,有插入,修改,删除,打印,查找功能
- 获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。
- jQuery实现带右侧索引功能的通讯录示例【附源码下载】