Android ListActivity总结
软件开发人员实习心得3篇_实习心得体会_

软件开发人员实习心得3篇实习是我们步入社会的桥梁,是一个能帮助我们完成校园人到社会人转变的过渡阶段,本文为实习心得,欢迎大家阅读借鉴。
软件开发人员实习心得一:在大学里的最后一个冬天,我完成了3个月的实习,实习对我而言是一个难忘的体验,让我不论做人还是做事都改变了很多。
总的来说,虽然说不上乐在其中,但实习的确是一段充实而有意义的事。
实习期间积蓄了太多太多的感悟。
借此机会跟大家分享一二。
感悟一: 当我们进入社会工作,就先要进入各种规范中去。
作为一个软件开发人员,记得在我第一天进入公司实习的时候,首先要学习的就是编程规范。
相信每个搞开发的同学都跟我一样吧。
编程规范在学校里是十分不重视的。
老师也不会硬性地要求学生要遵照怎样的规范去编写代码,实验或者作业什么的,只要能实现功能就ok了。
但是公司却不一样,公司的代码并不是一个人编写,别人很可能需要阅读甚至修改你的代码,阅读一个不符合规范的代码,所需要的时间可能比重新开发还要漫长。
代码规范的重要性是不言而喻的。
当然,作为一个开发人员的前提,我还是公司里的一个员工(虽然不是正式的。
)。
我还必须遵守员工的规范。
其实员工规范也没有什么特别多的要求,个人认为就跟上学差不多,虽然规范是差不多,心态上却有着很大的差异。
原因无他,你到学校是自己交钱上学,上班却是别人发工资给你。
拿了人家钱,还要扰乱人家的规范,这种事我还真干不出来。
看来钱不论到哪里都是一个问题,呵呵感悟二: 我其实是一种很唯心的动物其实本来,我是写"人其实是一种很唯心的动物",但不知道别人是不是也这样,虽然我觉得是,却无从考究,还是严谨点。
为什么说我唯心呢? 当我心里把自己当作一个学生,跟把自己当作一个上班族时,在各种细节上都会不一样,例如那有点虚无缥缈的"气质",或者是说话的语气。
这个大概是"站在不同的高度,看到不同的风景"吧。
正如老总看的是公司发展方向,主管却在看业绩,经理在看项目,小弟们在看代码。
android应用开发实训总结

android应用开发实训总结一、前言Android应用开发是一项非常有趣和具有挑战性的任务。
在这个实训中,我们学习了如何使用Java和Android Studio开发应用程序。
本文将总结我们的学习经验和教训,以便更好地了解如何开发高质量的Android应用程序。
二、基础知识在开始开发Android应用程序之前,需要掌握以下基础知识:1. Java编程语言。
2. Android操作系统的基本架构和组件。
3. Android Studio集成开发环境(IDE)的使用方法。
三、项目准备在创建一个新的Android项目之前,需要进行以下准备工作:1. 安装Java JDK和Android Studio。
2. 配置Android SDK并下载所需的API级别。
3. 选择适当的设备模拟器或连接物理设备进行测试。
四、创建新项目在创建新项目时,需要注意以下几个方面:1. 命名约定:包名必须是唯一的,建议使用公司或组织名称作为包名前缀。
2. 目标API级别:根据目标设备选择适当的API级别。
3. 模板选择:可以根据需求选择不同类型的模板来创建项目。
五、布局设计布局是指定义用户界面元素(如按钮、文本框等)在屏幕上的位置和大小。
Android提供了多种布局类型,如线性布局、相对布局、表格布局等。
在设计布局时,需要注意以下几点:1. 界面元素的大小和位置应该适合不同的屏幕分辨率。
2. 使用相对布局可以更好地适应不同的屏幕尺寸。
3. 避免使用绝对像素单位。
六、活动(Activity)Android应用程序中的活动是用户界面的基本组成部分。
每个活动都是一个独立的窗口,可以包含不同类型的用户界面元素。
在开发活动时,需要注意以下几点:1. 活动应该根据用户需求设计。
2. 活动之间可以通过意图(Intent)进行通信。
3. 活动生命周期是非常重要的,需要理解和掌握。
七、存储Android提供了多种存储选项,如SharedPreferences、SQLite数据库等。
第一行代码Android知识点总结

第一行代码知识点总结1、Android四层架构:Linux内核层(提供底层驱动)、系统运行库层(提供特性支持,一些核心库)、应用框架层(提供各种API)和应用层2、Android四大组件:活动(activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)3、Android应用特色开发:四大组件、丰富的系统控件、SQL数据库(轻量级,运算速度快的嵌入式关系型数据库)、强大的多媒体和地理位置定位(LBS)。
4、Android程序设计讲究逻辑和视图分离,通常在布局文件中编写在界面4.1Android的日志工具Log:Log.d()打印调试信息对应debug。
Log.v()打印琐碎、意义最小日志,对应verbose,Log.i()打印比较重要的数据对应info;Log.w()打印警告信息对应error;Log.e()打印错误信息对应error。
Log.d(类名,打印内容)4.2活动:主要用于和用户进行交互、基本用法4.3活动中的提醒方式Toast4.4、drawable存放图片,mipmap存放应用图标,values放字符串、样式,颜色等配置,layout放布局文件4.5、Android Studio是采用Gradle来构建项目5、Intent的使用:显式Intent和隐式Intent()6、活动的生命周期7、返回栈的定义8、Android是使用任务来管理活动的9、活动状态:运行、暂停、停止、销毁状态10、Activity类中的七个回调方法:onCreate()onStaart()、onResume()、onPause()、onStop()、onDestroy()和onRestart()11、活动的三种生存期:完整、可见、前台12、活动的四种启动模式:standard、singleTop、singleTask 和singleInstance13、常用控件:TextView、Button、EditText、ImageView、ProgressBar(进度条)、AlertDialog(对话框)、ProgressDialog (显示对话框时出现进度条)14、基本布局:线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)百分比布局、AbsoluteLayout、TableLayout15、常用和最难用的控件ListView16、滚动控件:RecyclerView17、碎片的定义、使用方式、碎片的生命周期、状态和回调18、广播主要的两种类型:标准广播和有序广播;注册广播的方式:静态注册和动态注册;广播接收器继承BroadcastReceiver19、本地广播(LocalBroadcastManager)20、Android系统中三种数据持久化方式:文件储存、SharedPreference储存及数据库储存,还有保存在手机SD卡中21、SQliteOpenHelper帮助类:SQliteOpenHelper中有两个抽象方法onCreate()和onUpgrade();两种重要的实例方法getReadableDatabase()和getWritableDatabase()22、LitePal操作数据库23、跨程序共享数据:内容提供器24、ContentResolver的基本用法:ContentResolver类、ContentResolver中提供给了一系列的方法用于对数据进行CRUD操作包括增删改查操作;ContentResolver增删改查方法不接收表名参数,而是用Uri参数代替。
android listview的用法

android listview的用法
Android中的ListView是一种可以显示垂直列表的滚动控件。
它为用户提供了一种可以浏览许多项目,而无需滚动屏幕的便捷方式。
ListView通常用来显示一组有序的数据,这些数据可以是文本,图像,或者其他任意形式的内容。
ListView可以包含任意数量的项目,而不会对屏幕上的性能造成影响。
使用ListView时,必须将它与ArrayAdapter(或其他类型的适配器)结合起来,这样ListView才能正确地显示数据。
ArrayAdapter可以将数据转换为ListView可以显示的格式。
要实现ListView,首先要在布局文件中定义ListView,然后在Activity中初始化ListView,并将ArrayAdapter与ListView绑定。
最后,可以为ListView 注册一个OnItemClickListener监听器,用于处理项目被单击时发生的事件。
kotlin 的listview

kotlin 的listviewKotlin 的ListView:简化Android 开发中的列表显示在Android 开发中,列表显示是非常常见和重要的功能之一。
ListView 是用于在Android 应用程序中显示可滚动列表的常用控件之一。
而Kotlin 是一种旨在简化Android 开发的现代编程语言。
本文将以Kotlin 的ListView 为主题,介绍如何使用Kotlin 在Android 应用程序中实现列表显示功能,并逐步回答各个相关问题。
一、什么是ListView?ListView 是Android 中用于显示可滚动列表的基本控件之一。
它可以在屏幕上垂直显示一系列项目,并可以根据需要滚动。
每个项目都由一个视图表示,且列表项目可以自定义以满足各种需求。
在Android 开发中,ListView 通常用于显示类似联系人、消息列表、音乐播放列表等的各种数据。
二、如何在Kotlin 中创建一个ListView?在Kotlin 中,我们可以使用Android Studio 的布局编辑器来创建ListView。
下面是一步一步的操作说明:1. 打开Android Studio,并创建一个新的Kotlin 项目。
2. 打开res/layout 目录,并找到activity_main.xml 布局文件。
3. 在activity_main.xml 文件中,将以下代码添加到布局文件中以创建一个ListView:xml<ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"/>4. 保存并关闭布局文件。
三、如何在Kotlin 中绑定ListView?在Kotlin 中,我们可以使用findViewById() 函数来绑定ListView。
使用ListActivity的总结_安卓程序开发

使用ListActivity的总结_安卓程序开发ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,实现数据源的绑定与显示,数据源通常会是一个array或者一个拥有查询结果的cursor. 只要我们设置了数据源,ListView就会自动地显示出来。
ListActivity本身有一个默认的layout,其中包含一个全屏的list。
如果用默认的layout,必须在onCreate()中注释掉setContentView()那一句。
虽然ListActivity内置ListView对象有默认的layout,但我们依然可以使用custom view,通过在onCreate()里面调用setContentView(resources id)。
不过要注意的是,在自定义的Layout 里面,必须包括一个(只能一个)ListView,而且要设置ListV iew对象的id为"@android:id/list";在Java代码里使用android.R.id.list。
下面的例子,如果当ListView中没有值而又想提示一句话时,那么用于指定显示提示信息的TextView的id 必须为"@android:id/empty",提示的信息可以通过android:text进行指定,当ListV iew里面没有data的时候,就会显示"No data"。
自定义的View (listview.xml):<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><ListView android:id="@id/android:list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"/><TextView android:id="@id/android:empty"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="No data"android:textColor="#ff0000"/></LinearLayout>加载Layout:@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.listview);//没有设置data source}官方提供了多种ListItem的Layout (yout),以下是较为常用的:§yout.simple_list_item_1 一行text§yout.simple_list_item_2 一行title,一行text§yout.simple_list_item_single_choice 单选按钮§yout.simple_list_item_multiple_choice 多选按钮§yout.simple_list_item_checked checkbox我们可以自定义自己的Layout (list_item.xml):<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageView android:id="@+id/icon"android:layout_width="48dip"android:layout_height="48dip" /><TextView android:id="@+id/text"android:layout_gravity="center_vertical"android:layout_width="0dip"android:layout_weight="1"android:layout_height="wrap_content" /></LinearLayout>使用时,以yout.list_item引用就行了。
《Android程序设计》期末总结
《Android程序设计》期末总结( 版权所有下载不究 - - )第一章:课后习题:1、下列不属于Android平台的技术架构的是:Java虚拟机JVM2、下面 Activity 通常就是一个单独的屏幕3、简述Android的优势:(1)系统的开放性和免费性(2)移动互联网的发展(3)相关厂商的大力支持(4)技术的进一步完善(5)开放收集联盟模式的挑战(6)其他技术的竞争本章重点:1、常见的手机操作系统:Symbian、Android、windows Mobile、IOS、OMS2、Android平台采用了软件栈,由低到高分为四部分:Linux内核层中间层(包括程序库(Libraries)和Android运行时环境)应用程序框架应用层3、一个android应用程序通常由4个组件构成:(1)活动(Activity),是最基本的android应用程序组件(2)意图(Intent),利用消息实现应用程序见的交互机制(3)服务(Service),是android应用程序中具有较长的生命周期但是没有用户界面的程序。
(4)内容提供器(Content Provider),提供了一种多应用间数据共享的方式。
其中活动(Activity)是必要部分。
课后习题:1、Activity生命周期中的(OnCreate())方法用于Activity初次创建时被调用。
2、(暂停)状态下的Activity失去了焦点,但是仍然对用户可见。
3、Activity的可见生命周期是(从调用onStart()方法到onStop()方法的整个过程)4、Android程序不能直接访问的资源存放在(assets目录)下5、简述Activity的生命周期中的各种方法。
每个Activity类在定义是都必须继承android.app.Activity(1)onCreate():Activity初次创建时被调用,在该方法中一般进行一些静态设置,如创建View视图,进行数据绑定。
android开发实验报告总结
android开发实验报告总结《android 开发实验报告总结》在当今科技飞速发展的时代,移动应用开发成为了热门领域之一,其中 Android 开发更是备受关注。
通过本次 Android 开发实验,我获得了丰富的实践经验和深刻的技术理解。
接下来,我将详细阐述这次实验的各个方面。
实验背景与目标随着智能手机的普及,Android 操作系统占据了相当大的市场份额。
本次实验的目标是通过实际开发一个简单的 Android 应用程序,深入了解 Android 开发的流程、技术架构以及相关工具的使用,从而提高自己的编程能力和解决问题的能力。
实验环境与工具在实验过程中,我们使用了 Android Studio 作为主要的开发工具。
Android Studio 提供了丰富的功能,包括代码编辑、调试、版本控制等,极大地提高了开发效率。
同时,还需要安装 Java 开发环境(JDK)以及 Android SDK 等必要的组件。
实验内容与步骤首先是项目创建。
在Android Studio 中,通过选择合适的项目模板,设定项目名称、包名等基本信息,创建了一个初始的 Android 项目框架。
接着是界面设计。
利用 XML 布局文件,定义了应用的界面元素,如按钮、文本框、列表等,并通过设置属性来调整它们的外观和位置。
同时,使用了 ConstraintLayout 等布局管理器,实现了灵活且美观的界面布局。
然后是功能实现。
通过编写 Java 代码,实现了应用的各种功能逻辑。
例如,点击按钮触发相应的事件处理,从网络获取数据并展示在界面上,以及与本地数据库进行交互等。
在数据存储方面,学习和使用了 SharedPreferences 来保存简单的配置信息,以及 SQLite 数据库来存储复杂的数据结构。
在网络通信方面,使用了 HttpURLConnection 或者 Volley 等库来发送 HTTP 请求,获取服务器端的数据。
调试与测试在开发过程中,不可避免会遇到各种问题。
Android实训实习报告总结
一、引言Android 学习已有一年半有余,先后做过两款游戏、三款应用和搭建一台服务端,也了解过一些Android相关的源码(JDK、SDK和NDK),学习Android不仅是对前沿开发技术的了解,也是对编程知识的一次提升。
巩固和学习了更多的Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解。
android入门后,只会照着别人的葫芦来画瓢,即没有设计思想,也没有自主原创的代码,不好不好于是乎,进了公司跟着项目走,用项目来驱动自己去学习和提高公司是1+1开发模式,即1个美工 + 1个工程师,负责完成一个项目(主要是游戏开发),就完全需要自己设计游戏的布局、逻辑,以及各种动画,来增强用户体验的效果当时主要是看Android官方的SDK API文档、中文API文档、 JDK源码,对有些感念不清楚,就上论坛去找答案,如CSDN、ITEye、IBM、知乎,或者去啃google 官方的文档。
二、新掌握的Java基础学习2.1、Activity View、Surfaceview的理解掌握了常用控件、view、surfaceview使用方式,知道怎样去适配不同屏幕后,每天就是重复的工作,堆砌代码,难以进一步去提升自己于是就自己给自个找点事干,自定义控件,如对话框背景等,或去google code找些开源的代码下来研究,学习人家的设计思想、模块功能的划分、代码组织结构等知识这个过程中,涉及到的知识比较多,如版本管理工具SVN、Git、Mercurial,如设计模式的思想,如怎样构建通用的开源应用框架(考虑sdk1.5等版本),如何适用在不同屏幕分辨率的手机上等等学习中会不断遇到一个又一个新的问题,因此需要不断去查资料、再学习各种工具,逐步积累,潜移默化中自己掌握的知识和工具就多了,眼界也开阔了。
2.2、android-pulltorefresh一个强大的拉动刷新开源项目,支持各种控件下拉刷新,ListView、ViewPager、WevView、ExpandableListView、GridView、ScrollView、Horizontal ScrollView、Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多。
android listactivity焦点控制及运用
android listactivity焦点控制及运用在Android中,ListActivity是一个实现了ListView的Activity。
它提供了一些特定的方法和功能来控制列表项的焦点以及与列表项的交互。
焦点控制:1. 列表项焦点:ListActivity会自动管理列表项的焦点。
通常情况下,当用户滑动或点击列表时,焦点会自动跟随变化。
可以通过设置列表项的onItemClickListener监听器来处理列表项的点击事件。
2. 列表控件焦点:ListActivity会自动获取ListView的焦点,但也可以通过调用setSelection()方法来设置具体的列表项获得焦点。
运用:1. 数据加载:可以通过实现ListActivity的onCreate()方法来加载数据,并将数据设置到ListAdapter中,然后通过调用setListAdapter()方法将ListAdapter设置给ListActivity。
这将自动将数据显示到列表中。
2. 自定义列表项布局:可以通过创建一个自定义的列表项布局,并实现ListAdapter来控制列表项的数据和展示方式。
然后通过setListAdapter()方法将自定义的ListAdapter设置给ListActivity。
3. 列表项点击事件处理:可以通过实现ListView.OnItemClickListener接口,并通过setOnItemClickListener()方法将点击事件监听器设置给ListView。
在点击事件中可以处理列表项的点击逻辑,如跳转到其他Activity或执行其他操作。
总结:ListActivity提供了简单的焦点控制和功能,可以快速实现一个列表页面,并对列表项的焦点和点击事件进行处理。
可以根据具体需求自定义列表项的布局和表现形式,并处理相应的交互逻辑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这两天在做一个短信群发器,在用ListActivity和CursorAdapter罗列联系人并记录用户输入时遇到了一些麻烦,解决过程颇为繁琐,深深感到Android API之广、杂的同时也让自己能静下心来谨慎编码仔细调试广泛查阅,现将最终成果和各种问题以及相应解决方法一一罗列,作为这两日的工作总结的同时,希望能给各位带来一些帮助。
先说明下这个模块要实现的功能吧,此模块主要为群发短信的地址输入模块,用户可以在EditText中直接输入地址,也可以从联系人中pick多个电话号码。
遇到的主要问题有:1.为了实现两种输入方式(直接EditText输入和联系人选择输入),创建了一个从联系人选择电话号码的ListActivity,为了能在地址编辑Activity和ListActivity之间切换而不丢失已经编辑了的电话号码,就得创建一种数据结构来保存这些电话号码,我这里使用的是一个LinkedList(具体结构后面再阐述),但是怎么样才能保证每次切换都能正确保存地址数据而且EditText内容与地址数据结构保持一致呢?!解决方法是在每次Activity切换时都先进行一次解析或提取过程:从EditText切换到ListActivity之前读取EditText 的字符串内容并分析获得地址数据保存到LinkedList中,从ListActivity切换到Activity之前解析LinkedList 内容获取要在EditText中显示的字符串内容。
2.有些联系人的号码不止一个,那么应该如何对待?这里我选择的方式和我的Android 2.3系统自带的短信发送器不一样,系统自带的在从联系人获取号码时,如果联系人的号码多于1个,会弹出一个对话框让用户选择一个号码,而我选择的时对话框让用户选择多个号码。
3.对话框与主Activity之间的通信问题,如何让对话框保存用户选择给Activity使用?这里我的解决方式是用静态变量和final变量,从内部类中调用这些变量。
4.用户从对话框选择号码后,如何更新ListActivity的显示内容?我的解决方法是用Handler,对话框给Handler发送消息,Handler使ListActivity更新界面,更新方法为调用Cursor的requery方法。
还有几个比较小的问题,比如联系人数据库的内容,ListActivity中CheckBox的绘制等,就不一一列举了。
现附上我的代码(代码上还有很多清晰的改动以及调试痕迹,呵呵):a.短信编辑Activity/** this Activity is created for sending message* users would edit sms message body in the EditText message , and destinations in the EditText receivers* there can be more than one destinations , and they are arranged at a strict layout* the phone number of every destination would be a String of digits , and they are separated by ','* and the spaces in the string are all ignored* a valid destinations description is like this : 1234 ,1254,1 3 52,6528,**/package com.tobacco.activity;import java.util.ArrayList;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import com.tobacco.pro.R;import com.tobacco.sms.SMSSender;public class EditMessAct extends Activity implements OnClickListener{private Button findContacts;private Button send;private EditText receivers;private EditText message;private ArrayList<String> dest;private static final char SEPARATE=',';@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.editmessage);init();}private void init(){findContacts=(Button)findViewById(R.id.contacts);send=(Button)findViewById(R.id.send);receivers=(EditText)findViewById(R.id.receivers);message=(EditText)findViewById(R.id.messagetext);findContacts.setOnClickListener(this);send.setOnClickListener(this);dest=new ArrayList<String>();}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent i;if(v==findContacts){refreshDest();i=new Intent(this,ListContactAct.class);this.startActivityForResult(i,1);}else if(v==send){refreshDest();String t=message.getText().toString();new SMSSender(t,dest).send();}}@Overrideprotected void onActivityResult(int request,int result,Intent intent){ super.onActivityResult(request,result,intent);int t=ListContactAct.selectedReceiver.size();int i=0;int k=0;int p,j;boolean mark;//String str="";for(i=0;i<t;i++){//str=str+ListContactAct.selectedReceiver.get(i).phoneNumber+";";p=ListContactAct.selectedReceiver.get(i).phoneNumber.size();for(k=0;k<p;k++){mark=true;for(j=0;j<dest.size();j++){if(ListContactAct.selectedReceiver.get(i).phoneNumber.get(k).equals(dest.get(j))){mark=false;}}if(mark){dest.add(ListContactAct.selectedReceiver.get(i).phoneNumber.get(k));}}}refreshText();//receivers.setText(str+receivers.getText().toString());}//refresh the EditText receivers by the ArrayList destprivate void refreshText(){String t="";int k=dest.size();int i;for(i=0;i<k;i++){t+=dest.get(i);t+=SEPARATE;}receivers.setText(t);}//refresh the ArrayList dest by the EditText receivers and return information of the analyze result private int refreshDest(){ArrayList<String> tempDest=new ArrayList<String>();String f=receivers.getText().toString();int k=f.length();String number="";for(int i=0;i<k;i++){if(f.charAt(i)==SEPARATE){if(number.length()>0){boolean tempMark=true;for(int m=0;m<tempDest.size();m++){if(tempDest.get(m).equals(number)){tempMark=false;break;}}if(tempMark){tempDest.add(number);}}number="";}else if(f.charAt(i)>='0'&&f.charAt(i)<='9'){number+=f.charAt(i);}}if(number.length()>0){boolean tempMark=true;for(int m=0;m<tempDest.size();m++){if(tempDest.get(m).equals(number)){tempMark=false;break;}}if(tempMark){tempDest.add(number);}}dest=tempDest;return 0;}}从联系人pick号码的ListActivity:package com.tobacco.activity;//import java.util.ArrayList;import java.util.ArrayList;import java.util.LinkedList;import android.app.AlertDialog;import android.app.ListActivity;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.provider.ContactsContract;import android.provider.Contacts.People.Phones;import android.util.Log;import android.view.View;import android.widget.CheckBox;import android.widget.ListView;import com.tobacco.adapter.ListContactsAdapter;import com.tobacco.pro.R;import com.tobacco.types.Receiver;@SuppressWarnings("deprecation")public class ListContactAct extends ListActivity{private Cursor cursor;public static LinkedList<Receiver> selectedReceiver;public static LinkedList<Integer> selectedPos;private int idColumn;private int displayNameColumn;public static Handler hand;//private Cursor phones=null;//private ArrayList<String> pNumber;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);//pNumber=new ArrayList<String>();selectedReceiver =new LinkedList<Receiver>();selectedPos=new LinkedList<Integer>();//cursor=getContentResolver().query(People.CONTENT_URI,null,null,null,null);//the cursor get by the above command has no column of has_phone_number cursor= managedQuery(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);debugColumnInfo();startManagingCursor(cursor);idColumn=cursor.getColumnIndex(ContactsContract.Contacts._ID);displayNameColumn=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);ListContactsAdapter adapter = new ListContactsAdapter(this,yout.listcontact,cursor,new String[] {Phones.DISPLAY_NAME},new int[] {R.id.people});this.setListAdapter(adapter);hand=new Handler(){@Overridepublic void handleMessage(Message msg){Bundle bundle=msg.getData();int pos=bundle.getInt("position");if(pos!=-1){cursor.requery();}}};}@Overrideprotected void onPause(){super.onPause();Intent intent=new Intent();intent.putExtra("date",1);setResult(1,intent);finish();}@Overrideprotected void onListItemClick (ListView l, View v, int position, long id){//Toast.makeText(this,""+position+"+"+id,Toast.LENGTH_SHORT).show();CheckBox cbx = (CheckBox) v.findViewById(R.id.check);String contactId=null;String displayName=null;int hasPhone;final int phoneCount;int t=0;int q=0;int i;cursor.moveToPosition(position);contactId=cursor.getString(idColumn);displayName = cursor.getString(displayNameColumn);while(q<selectedReceiver.size()&&!selectedReceiver.get(q).id.equals(contactId)){q++;}Integer intg=new Integer(position);while(t<selectedPos.size()&&!selectedPos.get(t).equals(intg)){t++;}if(t<selectedPos.size()){if(cbx.isChecked()){cbx.setChecked(false);}selectedReceiver.remove(q);selectedPos.remove(t);//the people has been added to the send list already/*phoneCount=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NU MBER));if(phoneCount>1){a}*/}else{//the people has not been added to the send list yethasPhone=Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_ PHONE_NUMBER)));//note:the variable hasPhone ,as the number stored in columnhas_phone_number is not represent the count of//phone numbers the people has,but the mark that if the people has at least one phone number ,1 has or 0 not//Toast.makeText(this,"phoneCount:"+phoneCount,Toast.LENGTH_SHORT).show();if(hasPhone>0){final Cursor phones = getContentResolver().query(monDataKinds.Phone.CONTENT_URI,null,monDataKinds.Phone.CONTACT_ID+ " = " + contactId, null, null);//Toast.makeText(this,"phoneCount22:"+phones.getCount(),Toast.LENGTH_SHORT).show();phoneCount=phones.getCount();final String[] pNums=new String[phoneCount];//pNumber=new ArrayList<String>();if (phones.moveToFirst()){i=0;do{//pNumber.add(phones.getString(phones.getColumnIndex(monDataKinds.Pho ne.NUMBER)));//pNumber is a ArrayList instance to record the phone numbers of the people that was clickedpNums[i]=phones.getString(phones.getColumnIndex(monDataKinds.Phone.N UMBER));i++;}while (i<phoneCount&&phones.moveToNext());}//Toast.makeText(this,""+pNumber.get(0),Toast.LENGTH_SHORT).show();if(phoneCount==1){if(!cbx.isChecked()){cbx.setChecked(true);}selectedReceiver.add(newReceiver(contactId,displayName,pNums[0]));Integer in=new Integer(position);selectedPos.add(in);}else if(phoneCount>1){final boolean[] mark=new boolean[phoneCount];final String name=displayName;final int p=position;final String conId=contactId;for(int w=0;w<phoneCount;w++){mark[w]=false;}AlertDialog ad=new AlertDialog.Builder(this).setTitle("select phone number").setMultiChoiceItems(pNums,mark,new DialogInterface.OnMultiChoiceClickListener(){public void onClick(DialogInterface dialog,int which,boolean isChecked){}}).setPositiveButton("okay",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog,int which){ArrayList<String> a=new ArrayList<String>();for(intu=0;u<mark.length;u++){if(mark[u]){a.add(pNums[u]);}}ListContactAct.selectedReceiver.add(new Receiver(conId,name,a));Integer in=newInteger(p);ListContactAct.selectedPos.add(in);Bundle bundle=new Bundle();bundle.putInt("position",p);Messagemsg=Message.obtain();msg.setData(bundle);ListContactAct.hand.sendMessage(msg);}}).setNegativeButton("cancel",null).create();ad.show();}}}super.onListItemClick(l, v, position, id);}private void debugColumnInfo(){int count=cursor.getColumnCount();int t=0;String tag="DebugColumn";for(;t<count;t++){Log.d(tag,cursor.getColumnName(t));}}}自定义Adapter:package com.tobacco.adapter;import com.tobacco.activity.ListContactAct;import com.tobacco.pro.R;import android.content.Context;import android.database.Cursor;import android.view.View;import android.view.ViewGroup;import android.widget.CheckBox;import android.widget.SimpleCursorAdapter;public class ListContactsAdapter extends SimpleCursorAdapter{public ListContactsAdapter(Context context, int layout, Cursor c,String[] from, int[] to) {super(context, layout, c, from, to);}@Overridepublic View getView(int position, View convertView, ViewGroup parent){View rowView=super.getView(position,convertView,parent);int t=0;Integer in=new Integer(position);while(ListContactAct.selectedPos.size()>t&&!ListContactAct.selectedPos.get(t).equals(in)){t++;}CheckBox cbx=(CheckBox)(rowView.findViewById(R.id.check));if(t<ListContactAct.selectedPos.size()){cbx.setChecked(true);}else{cbx.setChecked(false);}return rowView;}}。