ListActivity和自定义列表项
相信通过前两期的学习,以及会开发最简单的一些列表界面了吧,那么本期接着来学习更多方法技巧。
一、使用ListActivity
如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现, ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直接传入一个内容Adapter,ListActivity的子类就呈现出一个列表。
接下来通过一个简单的示例程序来学习基于ListActivity实现列表。
继续使用WidgetSample工程的listviewsample模块,在java包下创建MyListActivity.java文件,具体代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
public class MyListActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 定义一个数组
String[] persons = {"蜡笔小新", "皮卡丘", "蜘蛛侠", "灰太狼", "黑猫警长",
"孙悟空", "忍者神龟", "米老鼠", "HelloKitty", "樱桃小丸子"};
// 将数组包装成ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, persons);
// 设置该窗口显示列表
setListAdapter(adapter);
}
}
ListActivity的布局文件中只有一个ListView,只需要为ListActivity设置Adapter即可。
运行程序,可以看到下图所示界面效果。
从上图可以看到,ListActivity的默认布局是由一个位于屏幕中心的列表组成的。
二、自定义列表项
前面学习ListView都是使用的Android系统自定义列表项资源,基本都是一些纯文本的资源,界面不够炫目,也没有办法定制。在实际开发中,列表经常包括图标、按钮等组件,这就需要开发者自定义列表项来完成了。关键是需要给适配器Adapter提供足够的数据,让Adapter能够用更丰富的View对象来填充列表的每一行。
接下来就通过一个示例来学习如何自定义列表项。
同样使用WidgetSample工程的listviewsample模块,在app/main/res/layout/目录下创建custom_item_layout.xml文件,在其中填充如下代码片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
在res/layout/目录下新建一个custom_item.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="horizontal"
android:gravity="center_vertical">
<ImageView
android:id="@+id/icon_img"
android:layout_width="50dp"
android:layout_height="50dp"
android:padding="5dp"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/content_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:textColor="#00f"/>
</LinearLayout>
这个布局使用LinearLayout作为一行,其中图标位于左侧,文本位于右侧。
接下来为ListView提供Adapter,Adapter决定了ListView所要显示的列表项。在java包下创建CustomItemActivity.java文件,加载上面新建的布局文件,具体代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class CustomItemActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_item_layout);
// 获取界面ListView组件
ListView listView = (ListView) findViewById(R.id.listview);
// 定义一个List集合
final List<String> components = new ArrayList<>();
components.add("TextView");
components.add("EditText");
components.add("Button");
components.add("CheckBox");
components.add("RadioButton");
components.add("ToggleButton");
components.add("ImageView");
// 将List包装成ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.custom_item, R.id.content_tv, components);
// 为ListView设置Adapter
listView.setAdapter(adapter);
// 为ListView列表项绑定点击事件监听器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Toast.makeText(CustomItemActivity.this, components.get(position),
Toast.LENGTH_SHORT).show();
}
});
}
}
以上代码遵循前面学习的ListView示例的整体结构。其主要的区别就是使用了自定义列表布局R.layout.list_item。创建ArrayAdapter必须指定如下四个参数。
- context:要使用的上下文环境,几乎创建所有组件都需要传入Context对象。
- resource: 要使用的自定义列表项布局资源 ID。
- textViewResourceId:自定义列表布局中TextView的ID,该TextView组件将作为ArrayAdapter的列表项组件。
- objects:要实际显示的数组或List,将负责为多个列表项提供数据。 该数组或List包含多少个元素,就将生成多少个列表项。
运行程序,可以看到下图所示界面效果。
从上图可以看到,列表布局里面使用了我们自定义的图标,也修改了文本显示样式。
但是在这个示例中,所有的图标都是相同的,往往不能满足实际开发需求,会在下一节中来进行学习。
- Tomcat6/7应用服务器-禁用RC4等弱密码套件
- mybaits3整合spring总结
- 如何使用Airgeddon找回WiFi密码
- 设计缺陷将导致亚马逊Echo变身成为监听设备
- Unity引擎与C#脚本简介
- Redis分布式缓存系统Lua脚本食用指引
- 基于复杂方案OWSAP CsrfGuard的CSRF安全解决方案(适配nginx + DWR)
- XMLHttpRequest对象如何兼容各浏览器使用?
- Java使用wsdl生成axis版本webservice服务端/客户端代码
- Java微信支付快速入门&工具类
- redis集群 - linux安装与配置笔记
- Apache RocketMQ 4.0.0 - linux安装与配置笔记
- 数据库连接池-tomcat-jdbc食用笔记
- Java.NIO编程一览笔录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 面试官:请算出走迷宫需要的最少步数
- lua执行redis脚本找不到脚本的问题
- Android |《看完不忘系列》之dagger
- Android | dagger细枝篇
- ES UpdateByQuery Java Api
- [Bazel]repository_rule() vs rule()
- Windows 系统信息收集姿势
- 小白学PyTorch | 3 浅谈Dataset和Dataloader
- 小白学PyTorch | 4 构建模型三要素与权重初始化
- 小白学PyTorch | 5 torchvision预训练模型与数据集全览
- 细品redis的Scan和Keys命令
- if语句与while语句
- 内网渗透 | 基于IPC的横向移动
- 【DB笔试面试866】队列等待之enq: TX - allocate ITL entry
- 【Vue.js】Vue.js组件库Element中的上传、评分、穿梭框和表单