转载自:http://www.cnblogs.com/qianxudetianxia/archive/2011/08/04/2088493.html
游标ListView,提供索引标签,使用户能够快速定位列表项。
也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧。
一看图啥都懂了:
1.游标(Fast scroll thumb)
就是右边的那个拖动的方块,这个非常的简单:
也可以用在java后台书写:
在数据量有一定大的时候,滑动列表,就会出现右边的所谓的"游标"了。
简单,这也是我为什么私下里喜欢自己写控件,但是工作中却喜欢用通用控件。
我们看下源代码,其实就是启用FastScroller对象:
2.字母索引
在Android学习系列(10)--App列表之拖拽ListView(上)中我们使用了一种WindowManager在ListView中添加一些自定义影像,这种方法我觉得一定是可行的。
但是,android系统给我们提供了一个更简单的方法:使用AlphabetIndexer。
AlphabetIndexer,实现了SectionIndexer接口,是adapter的一个辅助类,辅助实现在快滑时,显示索引字母。
使用字母索引的话,必须保证数据列表是按字母顺序排序,以便AlphabetIndexerh采用二分查找法快速定位。
用到3个方法:
3.游标Cursor的实现
Cursor接口的实现,有两种选择:
(1).直接使用数据库查询返回的cursor
(2).自定义实现Cursor接口的新类
第一种方式很简单,查询一下数据库返回Cursor即可。
这里我们以第二种方式实践,伪装一个Cursor,主要是实现3个方法:
(1).getCount()
(2). moveToPosition()
(3). getString()
这个类的实例就可作为AlphaIndexer的构造函数第一个参数数据游标。
4.自定义Adapter的实现
使用前面介绍的东西,我们来实现最终的IndexAdapter:
5.跑起来
提供样本数据如下:
子项的布局文件:
使用并运行:
效果如下:
6.小结
这种索引效果,在大数据量列表显示中非常的实用,是android开发必备常识。
本文只是一个简单的sample,实际工作中肯定会需要进一步扩展定义:
(1).对于复杂类型的处理,可根据Map<String,?>扩展自定义实体类,再通过adapter转换使用即可。
(2).对于索引字母列表,可动态设置,举个例子,你的列表只有ABCD四个字母,如果索引字母列表还是设置“ABCDEFGHIJKLMNOPQRSTUVWXYZ”就不合适了,会有个索引偏位的问题。
(3).对于复杂界面的显示,可重写adapter的getView方法自定义视图。
在这里为了代码的简化,我们不再为每一个Button创建DialogInterface.OnClickListener()对象,而是只创建一个DialogInterface.OnClickListener()对象来分别实现它们的点击事件。具体实现代码如下:
DialogInterface.OnClickListener dialog = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if(which == DialogInterface.BUTTON_POSITIVE){//确定按键的点击事件 Toast.makeText(MainActivity.this, "ok!", 1).show(); } else if(which == DialogInterface.BUTTON_NEGATIVE){//取消按键的点击事件 Toast.makeText(MainActivity.this, "cancel", 1).show(); } else if(which == DialogInterface.BUTTON_NEUTRAL){//忽略按键的点击事件 Toast.makeText(MainActivity.this, "不知道", 1).show(); } } };
//对话框 new AlertDialog.Builder(this) .setTitle("删除")//设置标题 .setMessage("确定要删除指定的记录?")//设置提示消息 .setPositiveButton("确定",dialog) .setNegativeButton("取消",dialog) .setNeutralButton("忽略",dialog) .setCancelable(false)//设置按返回键是否响应返回,这是不响应 .show();//显示
非原创,原文出处: http://www.cnblogs.com/zxl-jay/archive/2011/09/30/2196671.html?login=1#commentform
使用calendar类设定指定的时间:
下周,或者下个月
Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2013); //设定年份 // calendar.set(Calendar.MONTH, 10); //设定月份,显示的比当前多一个月 calendar.set(Calendar.DAY_OF_MONTH, 20); //设定日期 calendar.set(Calendar.HOUR_OF_DAY, 17); //设定 小时 calendar.set(Calendar.MINUTE, 30); //设定分钟 // calendar.add(Calendar.DATE, 7); //下周的 calendar.add(Calendar.MONTH, 2); //下个月 Date date = calendar.getTime(); date.getTime(); SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); mDateFormat.format(date); Log.d("test", mDateFormat.format(date));
得到下周一的时间
public static long getNextWeekTime(int type, String hh, String mm){ SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hh)); calendar.set(Calendar.MINUTE,Integer.parseInt(mm)); switch (type) { case 0: calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); break; case 1: calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); break; case 2: calendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); break; case 3: calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY); break; case 4: calendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); break; case 5: calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); break; case 6: calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); break; } long currentTime = System.currentTimeMillis(); long scanTime = calendar.getTime().getTime(); if(currentTime > scanTime){ calendar.add(Calendar.DATE, 7); } Log.d("test"+ mDateFormat.format(calendar.getTime())); return calendar.getTime().getTime(); }
得到下周一的时间: