列表视图(ListView)和ListActivity——ArrayAdapter
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相关推荐
- android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter
我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...
- 高级控件——列表类视图——列表视图ListView
==================================================================================== 首页布局; <Linea ...
- Android列表视图(List View)
Android列表视图(ListView) ListView是一个显示滚动项列表的示视图组(viewgroup),通过使用适配器(Adapter)把这些列表项自动插入到列表中.适配器比如从一个数组或是 ...
- 安卓开发 5.6 初探列表视图(ListView)
文章目录 一.导读 二.列表视图的概述 1.继承关系图 2.列表视图API文档 3.列表视图四要素 4.四种常用适配器 三.案列演示 1.数组适配器案列---阅读古诗 (1) .准备工作 (2) .创 ...
- Android Studio 中列表视图(ListView)的应用
目录 引言 一.列表视图的作用 二.列表视图的工作原理和工作方式 三.准备数据源 四.适配器的使用 五.布局文件中的列表视图 六.自定义列表项布局 七.列表项点击事件处理 八.列表的优化 十.示例代码 ...
- 安卓学习之路之如何显示一个listview列表视图
1.新建个安卓项目,点击res下的values目录,在该目录下创建一个名字为arrays.xml的Android xml文件,然后开始在里面写代码,代码如下: <?xml version=&qu ...
- C#|Winform编程之(列表视图控件)listView控件
列表视图控件主要功能是将对象(文件.图片.项目)等通过列表的形式展示出来.就像我们在windows操作系统中点开每个文件夹之后对于文件夹下的文件,都是一种列表视图.我们可以选择大图标视图.小图标视图. ...
- data-role=listview是列表视图
Listview(列表,列表视图)是一个简单的无序列表,包是含链接的列表.添加了 data-role="listview" 属性来构成.jQuery Mobile 将应用所有必要的 ...
- 【Android笔记】如何创建列表视图3
接着上一篇实现一个带有复选框的列表视图,这要求对Adapter有比较清楚的理解. 1. ArrayAdapter从Layout读取TextView控件,返回给ListView显示,这个处理在Arra ...
最新文章
- 【Sql Server】DateBase-简单的Select查询
- 2021-08-02 json文件批量转化mask,生成train.txt路径make_path.py
- sql中的begin....end
- 用numpy autograd 实现牛顿迭代
- Java的call by value_call by value or reference ?
- pythondict增加-python字典键值对的添加和遍历方法
- Golang环境配置以及GOPATH与gomod的关系
- 【Nginx-20180108】Nginx的搭建文件服务器问题一则
- 论面向对象方法与软件复用关系-z
- Nacos配置的优先级
- 屏蔽非法路由,好好上网!
- Socket编程实践(11) --epoll原理与封装
- 【华为云分享】应用系统迁移华为云评估
- 加州伯克利计算机专业录取条件,加州大学伯克利分校计算机专业申请要求
- PCWorld:微软Google进军社交搜索需解决八问题
- 孙玄:微服务架构何去何从?
- ElementUI Cascader 级联选择器实现点击文本选中
- 基于阿里天池的淘宝用户行为分析
- RAR压缩包密码如何解密
- 中原工学院计算机二级证书,中原工学院@计算机等级考试二级MS_Office基础知识(常考知识点记忆).doc...
热门文章
- 放弃幻想,全面拥抱 Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较(上篇)... 1
- 三伏天,人体内有一个“冰箱”
- canvas实现剪切蒙层
- 这家公司太牛逼了,虽然这次不是重新造轮子!动画蒙版
- 25 Redis的缓存中的数据和数据库中的不一致问题
- 入木三分的意思,入木三分的主人公是谁?
- springboot2 + thymeleaf + shiro1.4+redis里前端shiro标签没法用
- 初学者眼中的PS和SAI
- Word 2016高级知识精通【一】页面布局设置、大纲级别设置、目录设置
- win10下pycharm永久激活