ListView以垂直列表的形式显示所有的列表项。
生成列表视图有如下两种方式:

  • 直接使用ListView进行创建。
  • 让Activity继承ListActivity(相当于该Activity显示的)。

一旦程序获得了ListView之后,接下来就需要为ListView设置它要显示的列表项了。在这一点上ListView显示出AdapterView的特征:通过setAdapter(Adapter)方法为之提供Adapter,并由Adapter提供列表项即可。

提示:ListView、GridView、Spinner、Gallery等都只是容器,而Adapter负责提供每个“列表项”的组件,AdapterView则负责采用合适的方式显示这些列表项。

AbsListView提供的常用XML属性及相关方法如下表所示:

ListView提供的常用XML属性如下表所示:

Demo:改变分隔条、基于数组的ListView。
程序清单:
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--直接使用数组资源给出列表项--><!--设置使用红色的分隔符--><ListView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="#f00"android:dividerHeight="2px"android:headerDividersEnabled="false"android:entries="@array/books"></ListView>
</LinearLayout>

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="books"><item>Hello Java</item><item>Hello JavaWeb</item><item>Hello Android</item><item>Hello Python</item></string-array>
</resources>

MainActivity.java

package com.example.simplelistviewtest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

显示效果如下图所示:

使用数组创建ListView十分简单,但这种ListView能定制的内容很少,甚至连每个列表项的字号大小、颜色都不能改变。

如果想对ListView的外观、行为进行定制,就需要把ListView作为AdapterVeiw使用,通过Adapter控制每个列表项的外观和行为。


Adapter接口及实现类

Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。Adapter接口及其实现类的继承关系图如下:

从图中可以看出,BaseAdapter同时实现了ListAdapter、SpinnerAdapter两个接口,因此BaseAdapter及其子类可以同时为AbsListView、AbsSpinner提供列表项。

Adapter常用的实现类如下:

  • ArrayAdapter:简单、易用的Adapter,通常用于将数组或List集合的多个包装成列表项。
  • SimpleAdapter:并不简单、功能强大的Adapter,可以用于将List集合的多个对象包装成多个列表项。
  • SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
  • BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

Demo:使用ArrayAdapter创建ListView。

在界面布局文件中定义两个ListView。
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--使用红色的分隔条--><ListView
        android:id="@+id/listview_one"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="#f00"android:dividerHeight="2px"android:headerDividersEnabled="false"></ListView><!--使用绿色的分隔条--><ListView
        android:id="@+id/listview_two"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="#0f0"android:dividerHeight="2px"android:headerDividersEnabled="false"></ListView>
</LinearLayout>

上面的界面布局文件中定义了两个ListView,但这两个ListView都没有指定android:entries属性,这意味着它们都需要通过Adapter来提供列表项。

接下来Activity为两个ListView提供Adapter,Adapter决定ListView所显示的列表项。程序如下。
MainActivity.java

package com.example.arrayadaptertest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listViewOne = (ListView) findViewById(R.id.listview_one);//定义一个数组String[] arr1 = {"孙悟空","猪八戒","牛魔王"};//将数组包装为ArrayAdapterArrayAdapter<String> arrayAdapterOne = new ArrayAdapter<String>(this,R.layout.array_item,arr1);//为ListView设置AdapterlistViewOne.setAdapter(arrayAdapterOne);ListView listViewTwo = (ListView) findViewById(R.id.listview_two);String[] arr2 = {"Java","Android","Python","Scala"};ArrayAdapter<String> arrayAdapterTwo = new ArrayAdapter<String>(this,R.layout.array_item,arr2);listViewTwo.setAdapter(arrayAdapterTwo);}
}

创建ArrayAdapter时必须指定如下三个参数:

  • Context:这个参数无需多说,它代表了访问整个Android应用的接口。几乎创建所有组件都需要传入Context对象。
  • textViewResourceId:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件。
  • 数组或List:该数组或List将负责为多个列表项提供数据。

不难看出,创建ArrayAdapter时传入的第二个参数控制每个列表项的组件,第三个参数则负责为列表项提供数据。该数组或List包含多少个元素,就将生成多少个列表项,每个列表项都是TextView组件,TextView组件显示的文本由数组或List元素提供。

以第一个ArrayAdapter为例,该ArrayAdapter对应的数组为{“孙悟空”,”猪八戒”,”牛魔王”},该数组将会负责生成一个包含三个列表项的ArrayAdapter,每个列表项的组件外观由R.layout.array_item布局文件(该布局文件只是一个TextView组件)控制,第一个TextView列表项显示的文本为“孙悟空”,第二个列表项显示的文本为“猪八戒”……

array_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/textview"android:textSize="24dp"android:padding="10px"android:shadowColor="#f0f"android:shadowDx="4"android:shadowDy="4"android:shadowRadius="2">
</TextView>

运行效果:

Demo:基于ListActivity实现列表。

如果程序窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity类实现,ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直接传入一个内容Adapter,ListActivity的子类就呈现出一个列表。
例如如下程序:
MainActivity.java

package com.example.listactivitytest;import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;public class MainActivity extends ListActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//无须使用布局文件String[] arr = {"孙悟空","猪八戒","唐僧"};//创建ArrayAdapter对象ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,arr);//设置该窗口显示列表setListAdapter(arrayAdapter);}
}

上面程序的Activity继承了ListActivity,ListActivity无须界面布局文件——相当于它的布局文件只有一个ListView,因此,只要为ListActivity设置Adapter即可。上面程序使用Android默认提供的android.R.layout.simple_list_item_multiple_choice布局文件作为列表项组件,当然,也可以自定义这个布局文件。

运行效果如下:

列表视图(ListView)和ListActivity——ArrayAdapter相关推荐

  1. android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...

  2. 高级控件——列表类视图——列表视图ListView

    ==================================================================================== 首页布局; <Linea ...

  3. Android列表视图(List View)

    Android列表视图(ListView) ListView是一个显示滚动项列表的示视图组(viewgroup),通过使用适配器(Adapter)把这些列表项自动插入到列表中.适配器比如从一个数组或是 ...

  4. 安卓开发 5.6 初探列表视图(ListView)

    文章目录 一.导读 二.列表视图的概述 1.继承关系图 2.列表视图API文档 3.列表视图四要素 4.四种常用适配器 三.案列演示 1.数组适配器案列---阅读古诗 (1) .准备工作 (2) .创 ...

  5. Android Studio 中列表视图(ListView)的应用

    目录 引言 一.列表视图的作用 二.列表视图的工作原理和工作方式 三.准备数据源 四.适配器的使用 五.布局文件中的列表视图 六.自定义列表项布局 七.列表项点击事件处理 八.列表的优化 十.示例代码 ...

  6. 安卓学习之路之如何显示一个listview列表视图

    1.新建个安卓项目,点击res下的values目录,在该目录下创建一个名字为arrays.xml的Android xml文件,然后开始在里面写代码,代码如下: <?xml version=&qu ...

  7. C#|Winform编程之(列表视图控件)listView控件

    列表视图控件主要功能是将对象(文件.图片.项目)等通过列表的形式展示出来.就像我们在windows操作系统中点开每个文件夹之后对于文件夹下的文件,都是一种列表视图.我们可以选择大图标视图.小图标视图. ...

  8. data-role=listview是列表视图

    Listview(列表,列表视图)是一个简单的无序列表,包是含链接的列表.添加了 data-role="listview" 属性来构成.jQuery Mobile 将应用所有必要的 ...

  9. 【Android笔记】如何创建列表视图3

    接着上一篇实现一个带有复选框的列表视图,这要求对Adapter有比较清楚的理解. 1.  ArrayAdapter从Layout读取TextView控件,返回给ListView显示,这个处理在Arra ...

最新文章

  1. 【Sql Server】DateBase-简单的Select查询
  2. 2021-08-02 json文件批量转化mask,生成train.txt路径make_path.py
  3. sql中的begin....end
  4. 用numpy autograd 实现牛顿迭代
  5. Java的call by value_call by value or reference ?
  6. pythondict增加-python字典键值对的添加和遍历方法
  7. Golang环境配置以及GOPATH与gomod的关系
  8. 【Nginx-20180108】Nginx的搭建文件服务器问题一则
  9. 论面向对象方法与软件复用关系-z
  10. Nacos配置的优先级
  11. 屏蔽非法路由,好好上网!
  12. Socket编程实践(11) --epoll原理与封装
  13. 【华为云分享】应用系统迁移华为云评估
  14. 加州伯克利计算机专业录取条件,加州大学伯克利分校计算机专业申请要求
  15. PCWorld:微软Google进军社交搜索需解决八问题
  16. 孙玄:微服务架构何去何从?
  17. ElementUI Cascader 级联选择器实现点击文本选中
  18. 基于阿里天池的淘宝用户行为分析
  19. RAR压缩包密码如何解密
  20. 中原工学院计算机二级证书,中原工学院@计算机等级考试二级MS_Office基础知识(常考知识点记忆).doc...

热门文章

  1. 放弃幻想,全面拥抱 Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较(上篇)... 1
  2. 三伏天,人体内有一个“冰箱”
  3. canvas实现剪切蒙层
  4. 这家公司太牛逼了,虽然这次不是重新造轮子!动画蒙版
  5. 25 Redis的缓存中的数据和数据库中的不一致问题
  6. 入木三分的意思,入木三分的主人公是谁?
  7. springboot2 + thymeleaf + shiro1.4+redis里前端shiro标签没法用
  8. 初学者眼中的PS和SAI
  9. Word 2016高级知识精通【一】页面布局设置、大纲级别设置、目录设置
  10. win10下pycharm永久激活