Android项目技术总结:项目中选择任务的联系人引出android的spinner的监听问题
web版本的项目中有这样一个功能,动态添加联系人,并且可以修改,如下图:
可以由上面四图明显可以看出web上面的联系人功能,最多可以有七个列表,每个列表选择好了以后,又可以修改,如d图。前面选择好的联系人,后面则不能选,因为没有数据。
移植到android:
我在android上想要实现这样一个功能,一个Activity中有一个spinner,当我点击spinner其中的某一条的时候便弹出一个对话框。
于是我想到了setOnItemClickListener这个方法,测试发现有异常,一查源码发现:A spinner does not support item click events. Calling this method will raise an exception. 所以觉得这条路可能是走不同了。
于是我便实现了这个方法:setOnItemSelectedListener,下面是我的关键代码:
taskContactsSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
AlertDialog.Builder builder = new AlertDialog.Builder(SpinnerTest.this);
builder.setTitle("Contacts");
builder.setItems(mItems, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//点击后弹出窗口选择了第几项
new AlertDialog.Builder(SpinnerTest.this)
.setMessage("你选择的id为" + which + " , " + mItems[which])
.show();
}
}).show();
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
以上代码中的onItemSelected方法里面的语句为弹出一个对话框。
测试发现:当我一进入Activity的时候,onItemSelected中的语句便自动执行了,而我要的效果是,只有当我点击spinner中的某一条的时候,才能弹出该对话框。看到网上很多人说可以setSelect(0,false)可以防止一开始进入Activity便执行onItemSelected中的语句,表面上看效果是的,但实际上这样做只是掩耳盗铃,很多人可以发现,这样做了以后打开spinner点击第一条是没有动作执行的,只有点击其他的条数在反过来点击第一条才会有反映,但是如果前后两次点击相同的条目的话,第二次的点击也是无效的,那这是为什么呢?
带着这个疑问,我又查看了源码发现:onItemSelected这个方法是当spinner中的内容有改变的时候才会触发,虽然我们表面上spinner的数据没有什么变化,但是当我们点击的条目的id变化时,其内部是看作spinner有变化的,关键代码:
if (mDataChanged) {
handleDataChanged();
}
既然如此,便可以解释上面的问题了,两次点击同样的条目,是没有任何动作会发生的。一开始进入Activity的时候,spinner中有了数据肯定也是变化了,所以便会执行onItemSelected中的语句,所以一开始便会弹出一个对话框。
后来我又想到加入boolean标志来判断是否第一次进入activity等方法,发现效果都不能达到想象中的。
转载于:https://www.cnblogs.com/duancanmeng/archive/2012/02/23/2524640.html
Android项目技术总结:项目中选择任务的联系人引出android的spinner的监听问题相关推荐
- android中对sim卡联系人的增删改查以及监听sim卡联系数据的改变
sim卡联系人的增删改查主要是通过ContentProvider来进行操作的,在android中对sim卡联系人操作的provider是定义在IccProvider.java这个类中的,这个类位于an ...
- mat opencv 修改roi_OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat)...
OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat) 我正在尝试将我的图像的一部分切割(裁剪)到另 ...
- android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...
在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...
- 请教 indy 中的 tldUdpServer 如何实现对本地端口6100进行监听!
请教 indy 中的 tldUdpServer 如何实现对本地端口6100进行监听! Delphi / Windows SDK/API http://www.delphi2007.net/Delphi ...
- Android 如何从系统图库中选择图片
这几天我都在做Android的App,同时学习它的API,我将分享一些我学到的东西,比如: 如何从系统图库中选择图片. 首先,让我们来看看如何将手机系统图库集成到你的App中,然后再从图库中选择 ...
- 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )
文章目录 一.获取充电状态 二.被动获取充电状态 三.主动获取充电状态 参考 Google 官方文档 : 优化电池续航时间 一.获取充电状态 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获 ...
- flutter中state生命周期与app生命周期与路由监听
State生命周期 1.第一次展示到屏幕上时会依次调用当前element的构造函数,initState,didChangeDependencies,build 2.如果只是自己发生了更新,则只会回调b ...
- vue中实现全屏以及对退出全屏的监听
前言: vue中实现默认进来页面,某个div全屏,并监听退出全屏的次数,当退出全屏次数达到5的时候跳转到别的页面. 目录: 实现步骤: 1.页面上在你想要的容器上加上id = 'con_lf_top_ ...
- Android OkHttp+RxJava 史上最优雅的实现文件上传/下载进度的监听
本文已授权「刘望舒」微信公众号独家原创发布 前言 本文将直接使用RxHttp库实现文件上传.下载.断点下载.进度的监听,不对RxHttp做过多讲解,如果对RxHttp不了解,请移步 RxHttp 一条 ...
最新文章
- 利用ashx和ajax实现表格的异步填充
- File类判断和获取功能
- linux设备驱动程序调试方法,Linux设备驱动程序学习(2)-调试技术
- ajax静态加载图片,JQuery实现Ajax加载图片的方法
- 2021牛客暑期多校训练营4,签到题CFIJ
- (转载)C/C++:sizeof('a')的值为什么不一样?
- c语言语法大全,oc语言基本语法汇总分析
- 手机桌面便签怎么绑定手机号?
- vue xlsx插件导入
- 计算机取消右键粘贴,复制粘贴文件后鼠标右击取消粘贴功能的简单方法介绍
- python做淘宝客_python 做淘宝客程序(2)
- OpenWiFi简介与学习记录
- js实现页面视频监控全屏
- Mac修改默认的电子邮箱客户端
- Machine Learning | (1) Scikit-learn与特征工程
- 如何将照片黑白化,照片怎么变黑白色?
- 手机、平板与手表,华为一个都不能少
- Java基础笔记:Day_10 接口、匿名内部类
- 人员梯度培养_人才梯队培养计划方案
- 拉勾教育 重学数据结构与算法 08 | 字符串:如何正确回答面试中高频考察的字符串匹配算法?
热门文章
- 2/100. Hamming Distance
- POJ 3687 Labeling Balls
- .zip.001 -- .zip.003解压缩
- 修改NLS_DATE_FORMAT的四种方式
- 【转】 android sdk setup时出现:Failed to fetch URL
- Vue 视频播放插件vue-video-player
- JS原生 实现图片懒加载
- 下载并使用阿里图标库
- android 手势事件 重写,Android实现通过手势控制图片大小缩放的方法
- Python(7):__init__.py