通讯录索引条的功能实现
来源:互联网 发布:java环境一键安装 编辑:程序博客网 时间:2024/06/03 01:35
之前要做索引条,从网上搜罗很多代码,都感觉比较麻烦,再次整理出相对简单的实现逻辑,以供参考:
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;@Overridepublic 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;}@Overrideprotected 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);}
0 0
- 通讯录索引条的功能实现
- Android实现通讯录功能,排序+字母索引
- 实现简单功能的通讯录
- 仿通讯录快速索引的实现原理(包括中间的字母图和右边的索引条),例IndexableListView
- AddressBook通讯录右边索引条
- 用链表实现的通讯录的功能
- 基于 链表 实现通讯录的功能
- 用链表实现简单的通讯录功能
- iOS通讯录旁边的索引表的实现
- iOS 使用UILocalizedIndexedCollation实现通讯录样式的索引
- 私人通讯录功能详细实现
- PinnedSectionListView实现手机通讯录功能
- Android初级篇笔记-通讯录联想功能的实现
- 最近实现一个类似于微信通讯录的功能//
- 利用 双向循环链表 实现通讯录的功能
- UITableView 类似通讯录的索引
- android通讯录开发(粗糙实现微信通讯录的功能)
- android通讯录开发(粗糙实现微信通讯录的功能)
- iOS-私有API与runtime
- 官方手册集锦
- 为Android选择一个合适的架构
- Android studio导入eclipse项目且不改变目录结构
- super函数
- 通讯录索引条的功能实现
- Myeclipse查看、修改、设置快捷键
- 在部署HEXO时出现ERROR Deployer not found : github的问题解决办法
- Windows 7 64位下caffe配置cuda7.5 VS2013
- 总结 XSS 与 CSRF 两种跨站攻击
- 16年元旦时综述15年:匆匆那年
- 2016年计划
- interp1 函数-------一维数据插值函数
- C++模板元编程(二)