前言

  啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验。还有就是随着我们的实验的进行,代码量也会越来越多,所以在接下来的博文中会对源码进行取舍,而不会把全部的实验代码都放到博文中~

  大家在看博文时如果有什么意见或者感觉博主有说错、说的不清楚的地方可以在评论中留言,博主会第一时间回复大家~我们一起学习,共同进步~

  好啦~进入正题~

  本次Android开发,我们主要探讨一下Intent、Bundle的使用和ListVie的应用——即在实验中我们将复习事件处理、学习 Intent、Bundle 在Activity 跳转中的应用,并学习 ListView 以及各类适配器的用法,在其中我们也会简单讲述一下RelativeLayout(相对布局)的使用。

基础知识

1ListView 的使用

布局上比较简单,在布局文件中写上

即可,这样就创建了一个空的列表,然后在.java 文件中再填充数据,所以 id 是一定要设 的。

  在.java 文件中获得这个 ListView 之后,使用 Adapter 为这个 ListView 填充数据,常用 的 Adapter 有 ArrayAdapter、SimpleAdapter,这两种在下面会详细讲述如何使用。随着 ListView 中内容的丰富,以上两种 Adapter 已经很难满足需要,因此现在一般使用自定义 的 Adapter 来填充数据,如何使用自定义的 Adapter 会在拓展知识中讲。(Adapter的作用:数据在adapter中做了处理之后,显示在视图上)

ArrayAdapter

最简单的 Adapter,创建 ArrayAdapter 时需指定如下三个参数:

Context:这个参数无须多说,它代表了访问整个 Android 应用的接口。几乎创建所有组件 都需要传入 Context 对象。

textViewResourceId:一个资源 ID,该资源 ID 代表一个 TextView,该 TextView 组件将作 为 ArrayAdapter 的列表项组件。

数组或 List:该数组或 List 将负责为多个列表项提供数据。

示例:

在创建完 ArrayAdapter 之后,调用 ListView 的 setAdapter 方法即可将数据填充到 ListView 中。

   这里有一点要特别注意的是 textViewResourceId 是一个 layout,在这个 layout 中只能有 一个 TextView,其它任何组件都不能有,包括 LinearLayout 等布局组件,否则会报错。

SimpleAdapter

  一般的对于ArrayAdapter来说,只需要把一个数组和一个样式传递给ArrayAdapter之后就可以在视图上用一个列表显示出这个字符串数组。

  但是,比如我们手机的联系人目录所示,不仅仅是有列表,而且有头像,可能还有手机号码。所以,单纯的ArrayAdapter是不能够实现这种复杂的视图的。
  我们可以用SimpleAdapter来实现这种复杂的视图,不过需要设计样式。

  由于 ArrayAdapter 只能显示文字,功能实在有限,如果需要多填充一些内容的话指望不 上,这时候可以使用 SimpleAdapter。

  SimpleAdapter 相比 ArrayAdapter 强大很多,创建 SimpleAdapter 需要 5 个参数,第一个 参数依然是 Context,就不多说了,下面介绍余下的 4 个参数:

    第 2 个参数:该参数应该是一个 List<? Extends Map<String, ?>>类型的集合对象,该集 合中每个
Map<String, ?>对象生成一个列表项。

    第 3 个参数:该参数指定一个界面布局的 ID。该界面布局指定每一个列表项的样式。

    第 4 个参数:该参数应该是一个 String[]类型的参数,该参数决定提取 Map<String,
?>对 象中哪些 key 对应的 value 来生成列表项。

    第 5 个参数:该参数应该是一个 int[]类型的参数,该参数决定填充哪些组件。

  示例:

  首先构建好数据,这里模拟了一个图书清单,一个 map 中有两个 key,存放书名和价格, 然后添加到 list 中。

  

  然后创建 SimpleAdapter:

  

之后还是用 ListView 的 setAdapter 方法添加 Adapter。

  看一下 R.layout.item 文件:

  

  可以看到,一个 LinearLayout 包含两个 TextView,一个用于显示书名,一个用于显示价 格,这个 layout 用于规定 ListView 中每一个列表项的样式。SimpleAdapter 中的第四个 参数 String 数组与 map 的两个 key 对应,第五个参数 int 数组与这个 layout 中两个 TextView 的 id 相对应,注意 String[]数组与 int[]数组中的值要一一对应,在这个示例 中,key 为 name 的 value 填充到 id 为 name 的 TextView 中。效果如下图所示:

  

2、ListView 列表项的单击和长按

  方法原型如下:

  

  长按有返回值,在理论课的课件中写的很清楚了,这里就不解释了。注意在两个方法的参 数中都有 int i, long l 这两个参数,i 指的是这一项在列表中的位置,l 指的是这一项的 id,在 ArrayAdapter 和 SimpleAdapter 中,i 和 l 是相等的,在另一种 Adapter—— CursorAdapter 中,l 指的是从数据库中取出的数据在数据库中的 id 值。

3、ListView 数据更新

  直观地想,要实现数据更新,只要更新 List,重新创建一个 SimpleAdapter 就可以了,这 样会比较麻烦,SimpleAdapter 有一个 notifyDataSetChanged()方法,当之前创建该 SimpleAdapter 的 List 发生改变时,调用该方法就可以刷新列表了。要特别注意的一点 是,List 不能指向新的内存地址,即不能 list = new ArrayList<>();这样是不起作用 的,只能调用它的 remove(),add()等方法来改变数据集。

示例:

错误写法:

4、去掉标题栏

  正常的我们平时使用的Android应用都是不包含我们在使用AS调试时出现的标题栏的,那么,这个烦人的标题栏如何去掉呢~

  要去掉标题栏有多种做法,这里举一种方法。 Android Studio 创建项目时默认的 theme 是:

   

  它的定义是:

  

  修改 parent 即可:

   

5、星星图标的切换

  星星的切换难点在于如何得知星星此时是空心的还是实心的,这个也有多种做法,这里也 只介绍一种。

  每个 View 都可以设置 tag,通过 tag 可以用来判断该 View 现在的状态。在初始化的时 候,将 tag 设置为 0,标记此时为空心星星,如果星星被点击了,并且 tag 为 0,那么就把 图片换为实心的星星,然后设置 tag 为 1;如果 tag 为 1,那么就把图片换为空心的星星, 然后设置 tag 为 0。建议在 java 文件中给需要的 view 设置 tag。

  6、RelativeLayout(相对布局)简述(在以后将会推出Android开发重点难点篇详述相对布局,尽请关注~)

  RelativeLayout(相对布局)是除线性布局之外最常用的,它相对于线性布局来说比较灵活,在进行组件布局的时候用线性布局往往需要进行布局嵌套,而相对布局就不会那么麻烦,每个组件都可以指定与其它组件或父组件的位置,只是必须通过ID来进行指定。    

  RelativeLayout按照各子元素之间的位置关系完成布局。在此布局中的子元素里与位置相关的属性将生效。例如android:layout_below, android:layout_above等。子元素就通过这些属性和各自的ID配合指定位置关系。注意在指定位置关系时,引用的ID必须在引用之前,先被定义,否则将出现异常。

  补充一下用到的属性的说明:

表1.组件之间的位置关系属性  
属性名称 作用说明
android:layout_above 将组件放在指定ID组件的上方
android:layout_below 将组件放在指定ID组件的下方
android:layout_toLeftOf 将组件放在指定ID组件的左方
android:layout_toRightOf 将组件放在指定ID组件的右方
表2.组件对齐关系属性  
android:layout_alignBaseline 将该组件放在指定ID组件进行中心线对齐
android:layout_alignTop 将该组件放在指定ID组件进行顶部对齐
android:layout_alignBottom 将该组件放在指定ID组件进行底部对齐
android:layout_alignLeft 将该组件放在指定ID组件进行左边缘对齐
android:layout_alignRight 将该组件放在指定ID组件进行右边缘对齐
表3.当前组件与父组件对齐关系属性  
android:layout_centerHorizontal 将该组件放置在水平方向中央的位置
android:layout_centerVertical 将该组件放置在垂直方向的中央的位置
anroid:layout_centerInParent 将该组件放置在父组件的水平及垂直中央

拓展知识

自定义 Adapter

  前面介绍的 ArrayAdapter 和 SimpleAdapter 都有一定的局限性,SimpleAdapter 较 ArrayAdapter 要好一些,但还是不够灵活,假如我的某些列表项需要有一些特性,或者我 的列表项中的某些控件需要设置监听器,就不够用了。因此,强烈建议大家一开始就习惯。

  自定义 Adapter 来适配自己的列表,只在某些简单的情况下才使用前面介绍的两种 Adapter。

  自定义的 Adapter 需要继承 BaseAdapter:

  

上面列出的四个方法是必须重写的四个方法,下面一一介绍这四个方法:

int getCount();获得数据项列表的长度,也就是一共有多少个数据项;

Object getItem(int i);获得某一个数据项;

long getItemId(int i);获得数据项的位置;

View getView(int i, View view, ViewGroup viewGroup);获得数据项的布局样式,最重要的一个方法。

  自定义 Adapter 需要提供给一个数据列表才能填充数据,一般是一个 List
类型,以图书列表的例子为例,我们可以先给列表项创建一个类 Book,然后将 List<Book>传入 Adapter 中作为数据提供的列表:

  

  

依照刚刚的想法重写完之后,接下来是最重要的重写 getView()方法,首先解释一下三个 参数的含义:

    i 指的是当前是在加载第几项的列表项;

    viewGroup
是列表项 View 的父视图,调整列表项的宽高用的;

    view 指的是一个列表项的视图,我们需要给 view 一个布局,然后在布局中放置我们需要 的内容。

   

  getView()方法的最基本写法:

  这种方法没有充分利用 view 的特点,只是每次从屏幕外滚进来一个新的项就再加载一次布 局。其实 ListView 每次从屏幕外滚进来一项就会有一项滚出屏幕外,这个时候 view 是有 内容的,不过是旧的内容,因此我们只需要改变一下 view 的内容然后返回它就可以了,不 需要再去加载一次布局。

  

  getView()方法的改进版写法:

  

这样写可以减少一些重复的加载布局的操作,提高效率。

  但是每次 findViewById()也是一件很麻烦的事情,如果控件一多,也会降低 ListView 的 效率。因此,使用 setTag 的方法和新建一个
ViewHolder 类来提高这部分的效率。

  getView()方法改进版 2.0:

  

这样写的话 ListView 的效率就比较高了。 贴一下最终版的自定义 Adapter:

实验内容

本次实验模拟实现一个通讯录,有两个界面,第一个界面用于呈现通讯录,如下所示:

点击任意一项后,可以看到详细的信息:

实验要求

布局方面的要求:

1、通讯录界面

  每一项为一个圆圈和一个名字,圆圈与名字均竖直居中。圆圈中为名字的首字母,首字母 要处于圆圈的中心,首字母为白色,名字为黑色,圆圈的颜色自定义即可,建议用深色的 颜色,否则白色的首字母可能看不清。关于圆圈效果如何实现,还是参照实验一中的文章:http://blog.csdn.net/sysukehan/article/details/52022307,个人觉得文章中的方法灵活性不够高。

2、联系人详情界面顶部

  顶部的背景色在通讯录数据中已经给出,每个人对应有一种特定的颜色,这块背景色占整 个界面的 1/3,返回图标处于这块 View 的左上角,联系人名字处于左下角,星标处于右下 角,它们与边距都有一定距离,自己调出合适的距离即可。需要注意的是,返回图标与名 字左对齐,名字与星标底边对齐。这一块建议大家去看一下 RelativeLayout 的使用。

3、联系人详情界面中部

  使用的黑色 argb 编码值为#D5000000,稍微偏灰色一点的“手机”、“ft东青岛移动”的 argb 编码值为#8A000000。注意,电话号码那一栏的下边有一条分割线,argb 编码值为#1E000000,右边聊天符号的左边也有一条分割线,argb 编码值也是#1E000000,这条分割 线要求高度与聊天符号的高度一致,并且竖直居中。字体的大小看着调就可以了。“更多 资料”底部的分割线高度自己定,argb 编码值与前面的分割线一致。

4、联系人详情页面底部

  这个没什么说的,内容和样式都很清楚。

5、特别提醒,这次的两个界面顶部都没有标题栏,要用某些方法把它们去掉。 逻辑方面的要求:

功能方面的要求:

1、点击通讯录中的某一个联系人会跳转到联系人详情界面,呈现该联系人的详细信息;长按通讯录中的联系人会弹出对话框询问是否删除该联系人,点击确定则删除该联系人,点击取消则对话框消失。

注意对话框中的人名为被长按的联系人。

   2、联系人详情界面中点击返回图标会返回上一层,点击星标会切换状态,如果原先是空心 星星,则会变成实心星星;如果原先是实心星星,则会变成空心星星。

实验步骤

  本实验初始界面的 XML 布局是比较简单的,我们在一个 xml 布局文件中写好 一个 ListView(,这样就创建了一个空的列表,然后在.java 文件中再填充数据), 在另一个 xml 布局文件中使用线性结构写好两个 TextView,分别用来存放圆圈 背景及联系人的姓名。在第一个 TextView 中,我们使用第一次作业中按钮背景 的设计方法,在 drawable 文件夹中创建一个 xml 文件,运用其中的 size 方法来 设计一个圆形背景:

  接下来需要在.java 文件中获得这个 ListView , 使用 Adapter 为这个 ListView 填充数据。创建了一个 java 类用来存储相应的数据,初始化一些变量, 并使用 get 和 Set 方法来获得或者更改相应的数据。

  接下来为每一项数据创建一个对象,并添加在 List 中,方便之后传递数据 的操作。

  然后创建 Listview 的 Adapter。创建 SimpleAdapter 需要 5 个参数。

  首先构建好数据,一个 map 中有两个 key,分别存放 name 的首字母和 name, 储在字符数组和字符串数组中,把它们以 Map 键值对的形式添加到 list 中。

  即在最初的 xml 文件中一个 LinearLayout 包含两个 TextView,一个用于显 示这个 layout 用于规定 ListView 中每一个列表项的样式。SimpleAdapter 中 的第四个参数 String 数组与 map 的两个 key 对应,第五个参数数组与这个 layout 中两个 TextView 的 id 相对应,注意 String[]数组与 int[]数组中的值要一一对 应。

  接下来写 ListView 的单击和长按事件。在单击中,主要处理了页面转换 以及页面间的传值, 由于需要传一个对象, 所以 person 这个类需要实现 Serializable 这个接口,并把这个对象放到 intent 的 Extra 中,在长按事件 中,主要弹出 AlertDialog 以及处理删除,由于我用 List 模拟数据库来放数 据,所以需要将 List 对应的数据也一并删除; 第二个页面接应第一个页面传过 来的对象,由于传的是对象,所以用到了 getSerializableExtra 方法。在两个 方法的参 数中都有 int i,long l 这两个参数,i 指的是这一项在列表中的位置, l 指的是这一项的 id,在 ArrayAdapter 和 SimpleAdapter 中,i 和 l 是相等的。

  即在这里实现数据更新,SimpleAdapter 有一个 notifyDataSetChanged() 方法,当之前创建该 SimpleAdapter 的 List 发生改变时,调用该方法就可以刷 新列表了。要特别注意的一点 是,List 不能指向新的内存地址,即不能 list=new ArrayList<>();这样是不起作用的,只能调用它的 remove(),add()等方法来改 变数据集。

  星星的切换时使用 tag,每个 View 都可以设置 tag,通过 tag 可以用来判 断该 View 现在的状态。在初始化的时候,将 tag 设置为 0,标记此时为空心星 星,如果星星被点击了,并且 tag 为 0,那么就把 图片换为实心的星星,然后 设置 tag 为 1;如果 tag 为 1,那么就把图片换为空心的星星,然后设置 tag 为 0。建议在 java 文件中给需要的 view 设置 tag。  

最后修改 parent 来去掉标题栏。完成实验~

实验代码

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:paddingBottom="@dimen/activity_vertical_margin"
  8. android:paddingLeft="@dimen/activity_horizontal_margin"
  9. android:paddingRight="@dimen/activity_horizontal_margin"
  10. android:paddingTop="@dimen/activity_vertical_margin"
  11. tools:context="com.example.yanglh6.myapp3.MainActivity">
  12.  
  13. <ListView
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:id="@+id/Start">
  17.  
  18. </ListView>
  19. </RelativeLayout>

activity_info.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context="com.example.yanglh6.myapp3.InfoActivity">
  8.  
  9. <RelativeLayout
  10. android:layout_width="match_parent"
  11. android:layout_height="0dp"
  12. android:id="@+id/Top"
  13. android:layout_weight="1"
  14. android:background="@color/colorPrimaryDark">
  15.  
  16. <Button
  17. android:layout_width="50dp"
  18. android:layout_height="50dp"
  19. android:id="@+id/Back"
  20. android:layout_marginStart="10dp"
  21. android:background="@mipmap/back" />
  22.  
  23. <Button
  24. android:layout_width="35dp"
  25. android:layout_height="35dp"
  26. android:id="@+id/star"
  27. android:layout_alignParentBottom="true"
  28. android:layout_alignParentEnd="true"
  29. android:layout_marginBottom="25dp"
  30. android:layout_marginEnd="20dp"
  31. android:background="@mipmap/empty_star" />
  32.  
  33. <TextView
  34. android:layout_width="wrap_content"
  35. android:layout_height="40dp"
  36. android:id="@+id/Name"
  37. android:layout_alignParentBottom="true"
  38. android:layout_alignParentStart="true"
  39. android:textSize="25sp"
  40. android:layout_marginBottom="15dp"
  41. android:layout_marginStart="20dp"
  42. android:textColor="@color/white" />
  43. </RelativeLayout>
  44.  
  45. <LinearLayout
  46. android:layout_width="match_parent"
  47. android:layout_height="0dp"
  48. android:layout_weight="2"
  49. android:orientation="vertical">
  50.  
  51. <RelativeLayout
  52. android:layout_width="match_parent"
  53. android:layout_height="wrap_content">
  54.  
  55. <TextView
  56. android:layout_width="wrap_content"
  57. android:layout_height="wrap_content"
  58. android:id="@+id/telephone"
  59. android:layout_marginStart="12dp"
  60. android:layout_marginTop="10dp"
  61. android:textSize="20sp"
  62. android:textColor="@color/telephoneNumber" />
  63.  
  64. <TextView
  65. android:layout_width="wrap_content"
  66. android:layout_height="wrap_content"
  67. android:id="@+id/info1"
  68. android:layout_alignStart="@+id/telephone"
  69. android:layout_below="@+id/telephone"
  70. android:textSize="15sp"
  71. android:layout_marginTop="8dp"
  72. android:textColor="@color/telephone" />
  73.  
  74. <TextView
  75. android:layout_width="wrap_content"
  76. android:layout_height="wrap_content"
  77. android:id="@+id/info2"
  78. android:layout_alignBottom="@+id/info1"
  79. android:layout_marginStart="10dp"
  80. android:textSize="15sp"
  81. android:layout_toEndOf="@+id/info1"
  82. android:textColor="@color/telephone" />
  83.  
  84. <Button
  85. android:layout_width="30dp"
  86. android:layout_height="30dp"
  87. android:id="@+id/chat"
  88. android:layout_alignParentEnd="true"
  89. android:layout_alignTop="@+id/telephone"
  90. android:layout_marginEnd="15dp"
  91. android:layout_marginTop="8dp"
  92. android:background="@mipmap/chat" />
  93.  
  94. <View
  95. android:layout_width="2dp"
  96. android:layout_height="40dp"
  97. android:layout_alignTop="@+id/chat"
  98. android:layout_marginEnd="18dp"
  99. android:layout_toStartOf="@+id/chat"
  100. android:background="@color/line" />
  101.  
  102. <View
  103. android:layout_width="match_parent"
  104. android:layout_height="2dp"
  105. android:id="@+id/line"
  106. android:layout_alignStart="@+id/info1"
  107. android:layout_below="@+id/info1"
  108. android:layout_marginTop="10dp"
  109. android:background="@color/line" />
  110.  
  111. <ListView
  112. android:layout_width="match_parent"
  113. android:layout_height="wrap_content"
  114. android:id="@+id/more"
  115. android:layout_below="@+id/line"></ListView>
  116.  
  117. <View
  118. android:layout_width="match_parent"
  119. android:layout_height="18dp"
  120. android:layout_below="@+id/more"
  121. android:background="@color/line" />
  122. </RelativeLayout>
  123.  
  124. <ListView
  125. android:layout_width="match_parent"
  126. android:layout_height="match_parent"
  127. android:id="@+id/listview"></ListView>
  128. </LinearLayout>
  129. </LinearLayout>

info.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:id="@+id/cycle"
  9. android:textSize="18sp"
  10. android:textColor="@color/white"
  11. android:background="@drawable/shape"
  12. android:gravity="center"/>
  13.  
  14. <TextView
  15. android:layout_width="0dp"
  16. android:layout_height="wrap_content"
  17. android:id="@+id/name"
  18. android:textSize="20sp"
  19. android:layout_weight="1"
  20. android:textColor="@color/black"
  21. android:padding="15dp" />
  22. </LinearLayout>

more.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:id="@+id/cycle"
  9. android:textSize="18sp"
  10. android:textColor="@color/white"
  11. android:background="@drawable/shape"
  12. android:gravity="center"/>
  13.  
  14. <TextView
  15. android:layout_width="0dp"
  16. android:layout_height="wrap_content"
  17. android:id="@+id/name"
  18. android:textSize="20sp"
  19. android:layout_weight="1"
  20. android:textColor="@color/black"
  21. android:padding="15dp" />
  22. </LinearLayout>

MainActivity.java

  1. package com.example.yanglh6.myapp3;
  2.  
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.support.v7.app.AlertDialog;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.widget.AdapterView;
  8. import android.widget.ListView;
  9. import android.widget.SimpleAdapter;
  10. import android.os.Bundle;
  11. import android.view.View;
  12.  
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.ArrayList;
  16. import java.util.LinkedHashMap;
  17.  
  18. public class MainActivity extends AppCompatActivity {
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24.  
  25. final List<Map<String, Object>> data = new ArrayList<>();
  26.  
  27. /* 为每一项数据创建一个对象,并添加在List中 */
  28. final List<Info> Infos = new ArrayList<Info>() {{
  29. add(new Info("Aaron", "17715523654", "手机", "江苏苏州电信", "#BB4C3B"));
  30. add(new Info("Elvis", "18825653224", "手机", "广东揭阳移动", "#c48d30"));
  31. add(new Info("David", "15052116654", "手机", "江苏无锡移动", "#4469b0"));
  32. add(new Info("Edwin", "18854211875", "手机", "山东青岛移动", "#20A17B"));
  33. add(new Info("Frank", "13955188541", "手机", "安徽合肥移动", "#BB4C3B"));
  34. add(new Info("Joshua", "13621574410", "手机", "江苏苏州移动", "#c48d30"));
  35. add(new Info("Ivan", "15684122771", "手机", "山东烟台联通", "#4469b0"));
  36. add(new Info("Mark", "17765213579", "手机", "广东珠海电信", "#20A17B"));
  37. add(new Info("Joseph", "13315466578", "手机", "河北石家庄电信", "#BB4C3B"));
  38. add(new Info("Phoebe", "17895466428", "手机", "山东东营移动", "#c48d30"));
  39. }};
  40.  
  41. char[] cycle = new char[Infos.size()];
  42. for (int i = 0; i < Infos.size(); i++) {
  43. char x = Infos.get(i).getcycle();
  44. cycle[i] = x;
  45. }
  46. String[] name = new String[Infos.size()];
  47. for (int i = 0; i < Infos.size(); i++) {
  48. String x = Infos.get(i).getName();
  49. name[i] = x;
  50. }
  51. for (int i = 0; i < Infos.size(); i++) {
  52. Map<String, Object> temp = new LinkedHashMap<>();
  53. temp.put("cycle", cycle[i]);
  54. temp.put("name", name[i]);
  55. data.add(temp);
  56. }
  57.  
  58. /* ListView单击事件 */
  59. ListView listView = (ListView) findViewById(R.id.Start);
  60. final SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, R.layout.info,
  61. new String[]{"cycle", "name"}, new int[]{R.id.cycle, R.id.name});
  62. listView.setAdapter(simpleAdapter);
  63.  
  64. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  65. public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
  66. Intent intent = new Intent(MainActivity.this, InfoActivity.class);
  67. Info temp = Infos.get(i);
  68. intent.putExtra("Info", temp);
  69. startActivity(intent);
  70. }
  71. });
  72.  
  73. /* ListView长按事件 */
  74. listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
  75. @Override
  76. public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
  77. AlertDialog.Builder message = new AlertDialog.Builder(MainActivity.this);
  78. message.setTitle("删除联系人");
  79. message.setMessage("确定删除联系人" + Infos.get(position).getName());
  80. message.setPositiveButton("确定", new DialogInterface.OnClickListener() {
  81. public void onClick(DialogInterface dialogInterface, int i) {
  82. Infos.remove(position);
  83. data.remove(position);
  84. simpleAdapter.notifyDataSetChanged();
  85. }
  86. });
  87. message.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  88. public void onClick(DialogInterface dialogInterface, int i) {
  89. }
  90. });
  91. message.create().show();
  92. return true;
  93. }
  94. });
  95. }
  96. }

Info.java

  1. package com.example.yanglh6.myapp3;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /* 存储相应的数据 */
  6. public class Info implements Serializable {
  7.  
  8. public Info(String name, String tel, String info1, String from, String background) {
  9. this.background = background;
  10. this.info1 = info1;
  11. this.from = from;
  12. this.name = name;
  13. this.tel = tel;
  14. }
  15.  
  16. public String getBackground() {
  17. return background;
  18. }
  19.  
  20. public void setBackground(String background) {
  21. this.background = background;
  22. }
  23.  
  24. public String getName() {
  25. return name;
  26. }
  27.  
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31.  
  32. public String getFrom() {
  33. return from;
  34. }
  35.  
  36. public void setFrom(String from) {
  37. this.from = from;
  38. }
  39.  
  40. public String getTel() {
  41. return tel;
  42. }
  43.  
  44. public void setTel(String tel) {
  45. this.tel = tel;
  46. }
  47.  
  48. public String getinfo1() {
  49. return info1;
  50. }
  51.  
  52. public void setinfo1(String info1) {
  53. this.info1 = info1;
  54. }
  55.  
  56. public char getcycle() {
  57. char first = name.charAt(0);
  58. if (first >= 97 && first <= 122) {
  59. first -= 32;
  60. }
  61. return first;
  62. }
  63.  
  64. private String background;
  65. private String info1;
  66. private String from;
  67. private String name;
  68. private String tel;
  69. }

InfoActivity.java

  1. package com.example.yanglh6.myapp3;
  2.  
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.view.View;
  7. import android.widget.ArrayAdapter;
  8. import android.widget.RelativeLayout;
  9. import android.widget.TextView;
  10. import android.widget.Button;
  11. import android.widget.ListView;
  12.  
  13. public class InfoActivity extends AppCompatActivity {
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_info);
  19.  
  20. Info p = (Info) getIntent().getSerializableExtra("Info");
  21.  
  22. RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.Top);
  23. relativeLayout.setBackgroundColor(Color.parseColor(p.getBackground()));
  24.  
  25. Button back = (Button) findViewById(R.id.Back);
  26. back.setOnClickListener(new View.OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. finish();
  30. }
  31. });
  32.  
  33. TextView info1 = (TextView) findViewById(R.id.info1);
  34. info1.setText(p.getinfo1());
  35.  
  36. TextView info2 = (TextView) findViewById(R.id.info2);
  37. info2.setText(p.getFrom());
  38.  
  39. TextView name = (TextView) findViewById(R.id.Name);
  40. name.setText(p.getName());
  41.  
  42. TextView tel = (TextView) findViewById(R.id.telephone);
  43. tel.setText(p.getTel());
  44.  
  45. String[] operations1 = new String[]{"更多资料"};
  46. ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<>(this, R.layout.more, operations1);
  47. ListView listView1 = (ListView) findViewById(R.id.more);
  48. listView1.setAdapter(arrayAdapter1);
  49.  
  50. String[] operations2 = new String[]{"编辑联系人", "分享联系人", "加入黑名单", "删除联系人"};
  51. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, R.layout.more, operations2);
  52. ListView listView = (ListView) findViewById(R.id.listview);
  53. listView.setAdapter(arrayAdapter);
  54.  
  55. /* 星星的切换 */
  56. final Button star = (Button) findViewById(R.id.star);
  57. star.setOnClickListener(new View.OnClickListener() {
  58. @Override
  59. public void onClick(View v) {
  60. if (!tag) {
  61. star.setBackground(getDrawable(R.mipmap.full_star));
  62. tag = true;
  63. } else {
  64. star.setBackground(getDrawable(R.mipmap.empty_star));
  65. tag = false;
  66. }
  67. }
  68. });
  69. }
  70.  
  71. private boolean tag = false;
  72. }

实验截图

源码下载

源码下载点击这里~

1、本实验实验环境:

操作系统 Windows 10

实验软件 Android Studio 2.2.1

虚拟设备:Nexus_5X

API:23

2、贴代码的时候由于插入代码框的大小问题,代码格式不太严整,望见谅~

Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)的更多相关文章

  1. Android开发--UI之Bundle的使用

    Android开发–UI之Bundle的使用 最近,把之前学过的东西大体的整理了以下,并且想把学过的心得分享给大家.我自己做了一个小小的demo,以便说明具体的应用. 这里的两个界面是通过第一个界面输 ...

  2. Android开发——进程间通信之Bundle和文件

    0.  前言 不论是Android还是其他操作系统,都会有自己的IPC机制,所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是很不同的概念,线程是CPU ...

  3. 从零开始学android开发-用Intent启动Activity的方法

    启动另外一个Activity,可以有的方法有用setClass()和Component Name 1. 先说在setClass启动一个Activity的方法吧: Intent intent = new ...

  4. Android开发——使用intent传递对象

    intent传递对象有两种方法: 方式一:Serializable 方式 方式二:Parcelable方式 在这里不多介绍了,这一篇就是快速上手使用教程,至于详细原理介绍的,请看这一篇http://w ...

  5. Android开发之利用ViewPager实现在Activity或Fragment中引入别的布局文件实现滑动并进行页面跳转

    有些时候经常可以看到其他APP中有一排的图标,可以在一个界面中滑来滑去,并且图标可以进行点击事件进行页面的跳转.这里对这种方法的实现做出总结. 首先看一下图片: 下面这两种图片是在一个Fragment ...

  6. android 开发 实现一个带图片Image的ListView

    注意:这种实现方法不是实现ListView的最优方法,只是希望通过练习了解ListView的实现原理 思维路线: 1.创建drawable文件夹将要使用的图片导入进去 2.写一个类,用于存放图片ID数 ...

  7. Android开发2021.3.9日【模拟器路径】【外观字体】【简单快捷键】

    一. 1.模拟器存储路径 D:\Android\SDK\platforms(在本人的dell上) 2.使用软件 Android Studio4.2 3.注意事项 (1)修改JDK的路径为自己下载的JD ...

  8. android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题

    近期项目里面有个需求,一个页面放了一个ScrollView,整个页面能够向上滚动,然后ScrollView里面又嵌套了一个ListView,ListView里面的数据也是能够上下滑动的,理论上List ...

  9. Android开发(三十)——ScrollView中ListView的高度自动适应

    int totalHeight = 0; for (int i = 0; i < mStrings.length; i++) { //pullList ListView //mAdapter A ...

随机推荐

  1. C#设计模式系列:策略模式(Strategy)

    1.策略模式简介 1.1>.定义 策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致.客户只关心目标而不在意具体的实现方法,实现方法要根据具体 ...

  2. jQuery 2.0.3 源码分析core - 选择器

         声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢!      打开jQuery源码,一眼看去到处都充斥着正则表达式,jQuery框架的基础就是查询了,查询文档元素对象 ...

  3. flat network 原理与配置 - 每天5分钟玩转 OpenStack(86)

    flat network 是不带 tag 的网络,要求宿主机的物理网卡直接与 linux bridge 连接,这意味着: 每个 flat network 都会独占一个物理网卡. 上图中 eth1 桥接 ...

  4. Rust初步(五):Rust与C#性能比较

    我学习Rust的目的并不是说期望用它来取代掉现有的开发平台或语言.相反,我认为当前绝大部分研发团队,都不可能只用一个平台或者一个语言. 当组织增长,他们越来越依赖大量的编程语言.不同的编程语言有不同的 ...

  5. Windows Live Writer 的昨日荣光

    今天这一篇文章,想写一写Windows Live Writer这款博客编辑器(最早的一个版本是2007年发布的).毫不夸张地说,这是为数不多的几款所见即所得的编辑器之一,当然,它的运行速度慢也是一个众 ...

  6. 窥探Swift之字符串(String)

    之前总结过Objective-C中的字符串<Objective-C精选字符串处理方法>,学习一门新语言怎么能少的了字符串呢.Swift中的String和Objective-C语言中NSSt ...

  7. Cocos2d-Lua (练手) 微信打飞机

    学习下lua,目前入门级,使用版本为 v3.3 Final For Win,空闲时间不足,只能断断续续写点东西.   一.子弹效果          子弹只做了一种,扇形发射,可以增加扇形大小,子弹的 ...

  8. java 连接数据库之一个完整的函数

    第一个参数要查询的列名第二个参数是连接的url第三个参数是用户名第四个参数密码第五个参数是执行的命令. 注意,url格式是 jdbc:mysql://localhost:3306/wechat jdb ...

  9. Oracle数据库备份、恢复及常见问题

    通常我们都是使用PL/SQL Developer来对Oracle中的数据对象和数据进行管理.如果我们想方便快速还原或者部署Oracle到新机器上,怎么进行数据库的备份.导入恢复呢? 这里我们必须要考虑 ...

  10. [Data Structure & Algorithm] Hash那点事儿

    哈希表(Hash Table)是一种特殊的数据结构,它最大的特点就是可以快速实现查找.插入和删除.因为它独有的特点,Hash表经常被用来解决大数据问题,也因此被广大的程序员所青睐.为了能够更加灵活地使 ...