更新时间 修改意见
2016-08-02 陈敏

第9节 ListView

在应用界面当中,经常需要使用列表来展示内容。
Android SDK提供了ListView控件,来实现这种效果。

ListView需要和Adapter配合使用,ListView负责内容的显示,Adapter负责为ListView提供要展示的数据。

列表的设计采用了将数据与展示分离的模式-数视分离。ListView负责数据的展现,Adapter负责向ListView提供要展示的数据,以及每条列表上的数据如何显示。

这是程序设计中常常用到的一种设计方法。这一章节我们主要介绍ListView,而它的搭档Adapter将放到下一章节详细介绍,所以现在我们只需要知道Adapter用来存放数据、规定每条列表项长什么样子。

9.1 ListView的使用方法

使用ListView展示内容,通常分下面几个步骤,

  1. 在布局文件中设置ListView布局;

    <ListView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/list_view">
    </ListView>
  2. 在Activity界面创建的时候(例如onCreate()当中),通过代码获取ListView

    ListView lv = (ListView) findViewById(R.id.list_view);
  3. 创建一个Adapter负责为ListView提供数据。Android SDK提供了很多类型的AdapterArrayAdapter CursorAdapter SimpleAdapter等等,它们都是BaseAdapter的子类,简化了Adapter的使用。要显示的数据和显示这项数据项的布局要设置给Adapter

    //每一项要显示的数据是一个字符串,这里设置显示3项
    String data[] = {"a", "b", "c"};
    //指定显示的数据内容,以及显示每项内容的布局文件
    ArrayAdapter adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1 , data);

    Android SDK提供了一些常用的数据项布局方式android.R.layout.simple_list_item_1 android.R.layout.simple_list_item_2等等。我们也可以自己设计每一项的布局方式,后面会讲到。

  4. Adapter设置给ListView,数据将以列表的形式被展示,

    lv.setAdapter(adapter);
  5. 为显示的每个item添加,点击时代响应处理函数;

    lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//添加需要响应的操作}
    });

综合以上的代码,就是,

ListView lv = (ListView) findViewById(R.id.list_view);
String data[] = {"a", "b", "c"};
ArrayAdapter adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1 , data);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//添加需要响应的操作}
});

运行以后,就能看到a b c以列表的形式,在界面上展现出来了。

9.2 ListView内容的更新

如果需要展示的数据有变化,就需要更新ListView,需要注意,

  1. 界面的更新需要在主线程进行(UI线程),如果在其他线程更新,系统有可能报错,并提示你“不能在非UI线程更新界面元素”;
  2. 修改了Adapter中要展示的数据后,需要使用AdapternotifyDataSetChanged(),界面就会刷新,看到修改的效果;

例如,初始化显示列表,并显示内容

    //要显示的数据用链表的形式保存;List data = new ArrayList<String>();data.add("a");data.add("b");data.add("c");//指定显示的数据内容,以及显示每项内容的布局文件ArrayAdapter adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1 , data);......

主线程中更新数据,并刷新,

//data已经做为数据列表保存到了Adapter当中,所以向这个data添加数据,会直接添加到Adapter保存的数据列表当中。
data.add("d");
adapter.notifyDataSetChanged();

9.3 常用效果

9.3.1 修改点按时的背景效果

列表项的背景颜色是可以根据点按的不同状态而变化的,例如点击列表项的时候,背景颜色变深一点,出于选中的状态,背景颜色与别的项不同等等。
这一切只需要为ListViewlistSelector属性设置上一个Selector就好了,例如,

<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="false" android:drawable="@color/normal"/><item android:state_pressed="true" android:drawable="@color/pressed"/>
</selector>

其中,@color/normalres/values/colors.xml中,被设计成,

<color name="pressed">#FF0000</color> -->红色
<color name="normal">#BED1DB</color> -->淡青色

使用的时候就像这样,

<ListView
    android:layout_width="match_parent"android:layout_height="match_parent"android:listSelector="@drawable/list_selector" -->设定不同状态下,列表项的背景颜色android:id="@+id/list_view">
</ListView>

大多数时候,希望那些没有被选中的列表项的背景颜色能和选中了但是没有被点击的列表项颜色一致,例如上面d列表项的背景要和c列表项没有被点击时一个颜色,那么可以为ListView的背景设置一个与没有点击的一样的颜色,

<ListView
   android:layout_width="match_parent"android:layout_height="match_parent"android:listSelector="@drawable/list_selector"android:background="@color/normal" -->设置一个没有点击时的背景颜色android:id="@+id/list_view">
</ListView>

这里有个非常重要的地方需要注意:对于ListView来说,只有当列表项被点击(press)或者获取焦点(focus)的时候,它对应的列表项才会被使用ListView设置的这个Selector

所以对于那些没有被点击或者没有获取焦点的数据项,即使它们满足Selector中的某些条件,Selector也将完全不起作用。

9.3.2 修改分隔线

ListView中每一个列表项之间的分隔栏是可以进行调整的,可以通过android:divider属性设定它的颜色,通过android:dividerHeight属性设定它的高度,

<ListView
   android:layout_width="match_parent"android:layout_height="match_parent"android:divider="#FF0000"    -->设定分隔栏的颜色android:dividerHeight="2dp"  -->设定分隔栏的高度android:id="@+id/list_view">
</ListView>

9.3.3 添加header和footer

ListView的顶部和底部,可以各添加上自定义栏。不过添加的过程需要在代码中进行,

  1. 用java代码或者xml的方式,创建要添加到header或者footer的界面;
  2. 使用addHeaderView()将header界面添加到ListView的顶部;
  3. 使用addFooterView()将footer界面添加到ListView的底部;
//添加header
ListView lv = (ListView) findViewById(R.id.list_view);
TextView header = new TextView(this);
header.setText("This is header.");
header.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
lv.addHeaderView(header);//添加footer
TextView footer = new TextView(this);
footer.setText("This is footer");
footer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
lv.addFooterView(footer);

9.3.4 ScrollBar

假如列表中的数据比较多,而用户又在上下滑动列表的时候,左边会出现一个滚动条,用来指示当前看到的内容在整个列表的比例位置。

可以通过android:scrollbars属性来设置这个bar是否需要显示,

  1. none:永远不显示;
  2. vertial:需要的时候显示在右边栏;
  3. horizontal:需要的时候显示在下边栏;
<ListView
    android:layout_width="match_parent"android:scrollbars="none" -->不显示android:layout_height="match_parent"android:id="@+id/list_view">
</ListView>

9.3.5 FastScroller

当列表中的数据非常多的时候,可以通过设置android:fastScrollEnabled属性,来启动FastScroller。可以让用户拖动右边的滑块,加快浏览的速度。不过,假如列表项不能占满4个屏幕的高度,那么即使设置了android:fastScrollEnabled属性,FastScroller也是不会出现的。毕竟数据少,也就不需要**Fast**scroller出马了。

<ListViewandroid:layout_width="match_parent"android:fastScrollEnabled="true" -->允许使用FastScrollerandroid:layout_height="match_parent"android:id="@+id/list_view">
</ListView>

Fastscroller的滑块和轨道是可以自定义的,在应用的主题中设定android:fastScrollTrackDrawableandroid:fastScrollThumbDrawable属性,就可以做出修改,

<style name="AppTheme"><item name="android:fastScrollTrackDrawable">@color/track</item><item name="android:fastScrollThumbDrawable">@mipmap/thumb</item>
</style>

/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。

*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

布局与控件(七)-ListView知多少(上)相关推荐

  1. Android 开发 -- 开发第一个安卓程序、Android UI开发(布局的创建:相对布局和线性布局、控件单位:px pt dp sp、常用控件 、常见对话框、ListView)

    文章目录 1. 开发第一个Hello World程序 1.1 开发程序 1.2 认识程序中的文件 1.3 Android程序结构 1.4 安卓程序打包 2. Android UI开发 2.1 布局的创 ...

  2. Android 数据显示控件(ListView实战演练)

    源码 [工程文件]:https://gitee.com/lwx001/ListView 推荐博客:(这个更详细.) https://blog.csdn.net/weixin_44949135/arti ...

  3. Flutter进阶—布局一个控件

    要在Flutter中布局单个控件,创建一个简单的控件并将其显示在屏幕上.在Flutter中,将文本.图标或图像放在屏幕上只需几步. 1.选择一个布局控件来保存对象 根据您希望对齐或约束可见控件的方式, ...

  4. Flutter学习指南:UI布局和控件,作为Android开发者

    showDialog(                 // 第一个 context 是参数名,第二个 context 是 State 的成员变量                 context: c ...

  5. Adapter类型控件之ListView(列表控件)

    (一)概述 Android中的列表控件飞创灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,在Android定义了3个列表控件:ListView.ExpandableListView和 ...

  6. Android 常见界面控件(ListView、RecyclerView、自定义View篇)

    Android 常见界面控件(ListView.RecyclerView.自定义View篇) 目录 3.3 ListView的使用 3.3.1 ListView控件的简单使用 3.3.2 常用数据适配 ...

  7. Android入门(二)——常见布局与控件

    文章目录 一.常见界面布局 1.线性布局 LinearLayout 2.相对布局 RelativeLayout 3.表格布局 TableLayout 4.帧布局 FrameLayout 二.常见界面控 ...

  8. java 控件内布局_Java开发桌面程序学习(二)————fxml布局与控件学习

    JavaFx项目 新建完项目,我们的项目有三个文件 Main.java 程序入口类,载入界面并显示 Controller.java 事件处理,与fxml绑定 Sample.fxml 界面 sample ...

  9. 数据绑定控件之ListView

    一.绑定控件之ListView 在往下进行前我们下来讨论下Asp.net的特性,对于Asp.net微软为我们封装了众多的控件,将控件拖拽到页面上就可以使用控件进行编程,而且值得称道的是有些封装良好的控 ...

  10. ProgressBar控件在Listview下的多线程应用(转自johngeng)

    .Net 下ProgressBar控件可以让程序在加载数据时让用户知道目前的进度.诸如安装程序,加载数据到Listview中等.下面就以ProgressBar控件在Listview下的应用为例. 1. ...

最新文章

  1. java微信oppo,OPPO实现全球首次5G微信视频通话,国产手机满分操作
  2. NoSQL(二):创建、管理集群
  3. 机器人学一些概念2——四元数,D-H 参数
  4. 洛谷P2751 [USACO4.2]工序安排Job Processing
  5. 系统分析之100亿级日志系统是怎么设计出来的?
  6. 饶过'(单引号)限制继续射入
  7. 【动态规划】石子合并
  8. JAVA如何代码静态检查术语_Sonar代码静态检查规则-JAVA篇(二)
  9. CCF NOI1139 高精度减法
  10. springboot调用so文件
  11. 基于忆阻器的神经网络应用研究
  12. 《禅者的初心》读书笔记(3)
  13. python商城管理系统_【程序源代码】全端商城管理系统(后台+小程序)
  14. <数据结构>链表实战之单链表与双链表的增删改查
  15. 基于macos M1 python3.8的tensorflow安装(简单方便几步完成)
  16. 电脑连接移动设备android驱动程序,安卓手机连接电脑操作最简单的方法介绍
  17. 钢材表面缺陷检测分类不同图像增强方式的对比研究
  18. java 矩形类的作用_java中关于矩形类
  19. [转]华为公司员工待遇全面揭秘
  20. WEB页面SEO —— 网站TDK优化细节

热门文章

  1. 微信蓝牙设备服务器,微信又更新了 支持连接蓝牙设备
  2. 超级码力在线编程大赛初赛第1场-1-树木规划题解
  3. 自动给服务器装linux,Linux全自动PXE无人值守安装服务器配置 | 旺旺知识库
  4. html页面中访问外站资源的时候协议的问题
  5. FPGA学习之数模转换(TLC5620)(通过4个按键输入,输出数模转换需要的数据和数码管显示需要的数据)
  6. 职场上情商高的人有什么特征,盘点职场上情商高的人必做的3件事
  7. 流程图用什么软件做?这篇文章告诉你(内附详细教程)
  8. in use 大学英语4word_2015年6月大学英语四级真题试题及答案(word完整版)
  9. Android绘制波浪线
  10. 如何在plsql中终止存储过程的执行