转载自: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();
}
得到下周一的时间: