Android ListView字母索引(仿微信通讯录列表)
来源:互联网 发布:彩票11选5遗漏数据分析 编辑:程序博客网 时间:2024/05/20 18:44
一、设计图
原理简介:
自定义一个View 继承 FrameLayout, 有3个子View: ListView(数据列表), ListView(索引字母列表), TextView(索引字母)。
二、字母列表原理
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mLetterAdapter = new LetterAdapter(h-getPaddingTop()-getPaddingBottom()); mLetterListView.setAdapter(mLetterAdapter); }onSizeChanged这个方法,会在第一次布局和屏幕发生变化的时候调用,这里取到字母ListView布局后的实际高度,就是参数中的h,让LetterAdapter计算出每个字母的高度,设给字母ListView,以保证所有的字母在view大小发生改变的时候都能显示完整。
/** * 构造方法 * * @param height view height */ public LetterAdapter(int height) { ... itemHeight = height/letterArray.length; }
而通过上图,当touch字母ListView 的时候,根据计算可以得到点击的是哪个字母,然后通过这个字母找到主ListView的对应的位置,通过主ListView的setSelection方法显示,并且把对应的字母设置到第一张图上面的TextView中。
三、主ListView的适配器设计原理
在主ListView的Adapter的构造中,1插入字母,2记录字母对应的位置(注意:传入的列表须已按着字母顺序排序好)。这样当字母列表滑动的时候,从Map中取出对应字母的位置,并显示即可。
四、使用
布局代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.justlcw.letterlistview.letter.LetterListView android:id="@+id/letterListView" android:layout_width="match_parent" android:layout_height="match_parent" > </com.justlcw.letterlistview.letter.LetterListView></RelativeLayout>
MainActivitypublic class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LetterListView letterListView = (LetterListView) findViewById(R.id.letterListView); letterListView.setAdapter(new TestAdapter()); } /** * 这里 使用一个简单的 NameValuePair 对象,做为测试 *@Title: *@Description: *@Author:Justlcw *@Since:2014-5-13 *@Version: */ class TestAdapter extends LetterBaseListAdapter<NameValuePair> { /** 字母对应的key,因为字母是要插入到列表中的,为了区别,所有字母的item都使用同一的key. **/ private static final String LETTER_KEY = "letter"; /** 这里的数据都已经按着字母排序好了, 所以传入进来的数据也应排序好,不然会出现跳转问题. **/ String[] dataArray = { "鞍山", "案场", "白宫", "白云", "白俄", "长沙", "常州", "常熟", "大厂", "大娜迦", "福州", "福建", "富豪", "广州", "湖南", "湖北", "胡同", "加州","加拉大", "家具", "开门", "开始", "可能", "连接", "利用","煤化工", "密度","漫画", "你好", "你的", "哪些", "欧版", "排行", "贫困", "平时", "请问", "确认", "其他", "染发", "让他", "头像", "是个", "数据", "天空", "退出", "提示", "为空", "维护", "新建", "想到", "用户", "阅读", "知道", "这本", "足球"}; public TestAdapter() { super(); List<NameValuePair> dataList = new ArrayList<NameValuePair>(); for(int i=0; i<dataArray.length; i++) { NameValuePair pair = new BasicNameValuePair(String.valueOf(i), dataArray[i]); dataList.add(pair); } setContainerList(dataList); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public String getItemString(NameValuePair t) { return t.getValue(); } @Override public NameValuePair create(char letter) { return new BasicNameValuePair(LETTER_KEY, String.valueOf(letter)); } @Override public boolean isLetter(NameValuePair t) { //判断是不是字母行,通过key比较,这里是NameValuePair对象,其他对象,就由你自己决定怎么判断了. return t.getName().equals(LETTER_KEY); } @Override public View getLetterView(int position, View convertView, ViewGroup parent) { //这里是字母的item界面设置. if(convertView == null) { convertView = new TextView(MainActivity.this); ((TextView)convertView).setGravity(Gravity.CENTER_VERTICAL); convertView.setBackgroundColor(getResources().getColor(android.R.color.white)); } ((TextView)convertView).setText(list.get(position).getValue()); return convertView; } @Override public View getContainerView(int position, View convertView, ViewGroup parent) { //这里是其他正常数据的item界面设置. if(convertView == null) { convertView = new TextView(MainActivity.this); ((TextView)convertView).setGravity(Gravity.CENTER_VERTICAL); } ((TextView)convertView).setText(list.get(position).getValue()); return convertView; } }}
实际效果如下
PS:
这里只是描述了我自己认为比较简单的实现方式,可拓展、可维护,不足之处望体谅、望指点。
(免积分源码: LetterListView )
0 0
- Android ListView字母索引(仿微信通讯录列表)
- android仿微信通讯录字母索引控件
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- Android 自定义 View 实现通讯录字母索引(仿微信通讯录)
- android 字母索引 listview
- Android字母索引列表
- Android仿微信通讯录功能,好友排序+字母索引
- Android仿微信通讯录功能,好友排序+字母索引
- Android自定义控件5----继承View通讯录索引功能之1初始化显示字母列表
- Android实现通讯录功能,排序+字母索引
- 自定义通讯录字母索引
- Android ListView城市列表,按a-z分组字母索引排序
- Android UI ListView实现字母索引 定位
- Android listview 侧栏字母索引排序
- Android ListView实现分组字母索引排序
- Android获取通讯录联系人,右侧字母滑动索引
- Android获取通讯录联系人,右侧字母滑动索引
- android通讯录列表,A~Z字母提示view
- hdu 2602 and poj 3624(01背包)
- ZooKeeper应用实例:Java实现与ZooKeeper的连接
- C#中使用Split分隔字符串的技巧
- Mysql 获取排列序号。
- Java线程(一):线程安全与不安全
- Android ListView字母索引(仿微信通讯录列表)
- CGI如何用C控制sqlite3?
- Python 中的文件读写(一)
- Java 并发模式之Master-Worker
- 打印日历
- hdu 3473 Minimum Sum(划分树-sum操作)
- Android app 重打包攻击和应对之策
- 项目复习期总结3:CSS引入方式,注释,命名规范,背景,行高,文本属性
- 关于自己对界面遍历的认识