ListView组件的使用
来源:互联网 发布:win7建立网络连接 编辑:程序博客网 时间:2024/05/16 01:50
本文转自:http://flysnow.iteye.com/blog/865944
ListView是Android开发中非常常用的组件,ListView可以用来显示一个列表,我们可以对这个列表操作,比如点击列表要做什么等等。这篇文章主要通过一个示例来展示ListView的用法。
一、 不使用 xml 布局文件创建一个 ListView
- 创建一个名称为 HelloListView 的 Android 工程;
- 要使用 ListView ,需要让你的 Activity 继承于 ListActivity,这个和以前的有区别,以前的都是继承 Activity 。ListActivity 继承自Activity,扩展了很多常用的用于操作 ListView 的方法,使用很方便;
- 现修改 HelloListView 类如下 :Java代码
- public class HelloListView extends ListActivity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //setContentView(R.layout.main);
- //设置一个Adapter
- setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,COUNTRIES));
- }
- //数据
- private static final String[] COUNTRIES=new String[]{"中国","俄罗斯","英国","法国"};
- }
- 运行程序效果如下:
看到了吧,我们的数据已经通过列表的形式显示了出来!这里主要是使用了一个Adapter— 适配器,你可以把适配器看成是ListView的数据源,ListView 要展示的数据都是以Adapter 的形式传递给 ListView 的。这个 Adapter 很重要, Android 的用于传给集合控件(ListView,Spinner,GridView 等)的数据都是以 Adapter 的形式传递的,这样的好处就是只要掌握了Adapter,就可以很随意的给这些集合控件传递数据,因为他们使用的都是 Adapter。适配器的关键就是适配,只需公布一个 Adapter,就全搞定了。 Android 已经给我们实现了一些常用的适配器,如刚刚使用的数组适配器,还有简单适配器等。我们还可以通过自定义适配器来实现自己的适配器。其实一种适配器就对应了一个集合控件中的一个元素的布局展示。
二: 使用 xml 来自定义 ListView
- 上个例子我们并没有使用在main.xml中定义一个ListView 的形式来布局ListView,而是使用的 ListActivity 中默认的 ListView 来演示的;
- 下面就使用我们在main.xml中自定义的 ListView, 这样我们可以很方便的控制 ListView 展示的布局、大小、背景色等属性。当然上个例子中我们一样可以通过getListView获取ListView后使用它的方法来改变布局、大小和背景色等;
- 修改 main.xml 为:这里要注意的是我们设置 ListView 的 id 为 ”@android:id/list”, 意思是我们引用Androi 已经为我们定义好的一个id,名字是list,如果你不定义成这样,这个 ListView 是不能被 ListActivity 识别的。然后就是添加了一个蓝色的背景,看看我们这个自定义的 ListView 是否起了作用。Xml代码
- <?xml version="1.0" encoding="utf-8"?>
- <ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#FF0000FF"
- >
- </ListView>
- 修改 HelloListView 类为:比上个例子只是多了 setContentView(R.layout. main ); 是为了让 Android 识别我们定义的 ListView 。Java代码
- public class HelloListView extends ListActivity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //设置一个Adapter
- setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,COUNTRIES));
- }
- //数据
- private static final String[] COUNTRIES=new String[]{"中国","俄罗斯","英国","法国"};
- }
- 运行效果图:
背景已经变成了蓝色,说明我们在xml中定义的ListView起作用了。
三: 自定义要展示的元素
- 前面的两个例子都是展示一行文字,如果我们想图文混排怎么做呢,比如前面是文字,后面是图片。要实现这种功能就需要我们自定义Adapter;
- 新建布局文件 item.xml, 内容如下:Xml代码
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/text"
- android:layout_alignParentLeft="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <ImageView
- android:id="@+id/image"
- android:layout_alignParentRight="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
这里主要定义一个TextView和一个ImageView,用于显示列表每一行的文本和图片
- 修改 HelloListView 类如下:这里的主要地方是自定义了一个 Adapter ,我们只需要继承 BaseAdapter 即可, BaseAdapter 已经实现了 Adapter的大部分方法,我们继承后只需要实现部分的方法即可。必须实现的就是 getCount 和 getView 方法,前一个是返回ListView 中有多少个元素,后一个是生成要展示的 View 。 ListView 在每添加一个 View 是就会调用 Adapter 的getView 方法,所以我们有必要对这个方法做优化,例子中就做了部分的优化,一般面试的时候会被问到 ListView 优化,回答例子中的这些代码就差不多了。Java代码
- public class HelloListView extends ListActivity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //设置一个Adapter,使用自定义的Adapter
- setListAdapter(new TextImageAdapter(this));
- }
- /**
- * 自定义视图
- *
- */
- private class TextImageAdapter extends BaseAdapter{
- private Context mContext;
- public TextImageAdapter(Context context) {
- this.mContext=context;
- }
- /**
- * 元素的个数
- */
- public int getCount() {
- return texts.length;
- }
- public Object getItem(int position) {
- return null;
- }
- public long getItemId(int position) {
- return 0;
- }
- //用以生成在ListView中展示的一个个元素View
- public View getView(int position, View convertView, ViewGroup parent) {
- //优化ListView
- if(convertView==null){
- convertView=LayoutInflater.from(mContext).inflate(R.layout.item, null);
- ItemViewCache viewCache=new ItemViewCache();
- viewCache.mTextView=(TextView)convertView.findViewById(R.id.text);
- viewCache.mImageView=(ImageView)convertView.findViewById(R.id.image);
- convertView.setTag(viewCache);
- }
- ItemViewCache cache=(ItemViewCache)convertView.getTag();
- //设置文本和图片,然后返回这个View,用于ListView的Item的展示
- cache.mTextView.setText(texts[position]);
- cache.mImageView.setImageResource(images[position]);
- return convertView;
- }
- }
- //元素的缓冲类,用于优化ListView
- private static class ItemViewCache{
- public TextView mTextView;
- public ImageView mImageView;
- }
- //展示的文字
- private String[] texts=new String[]{"机器人","QQ","小狗"};
- //展示的图片
- private int[] images=new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3};
- }
- 运行,我们会看到效果如图:
四、ListView 列表中的元素的单击事件响应
如果我们要想单击一个ListView的元素使其作出相应的响应怎么办呢?比如弹出什么,打开什么,展示什么等等,那么我们只需要实现单击事件的函数即可;
要实现ListView的单击事件有两种方法,一个是使用getListView().setOnClickListener(l );设置,这个和平时我们用的控件设置是一样的,不做介绍,下面介绍第二个,就是重写ListActivity的onListItemClick方法,其实这个的最后处理也是ListView的setOnClickListener进行监听调用的;
在 HelloListView 类中增加如下代码:
Java代码- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- Toast.makeText(this, "你单击了"+texts[position], Toast.LENGTH_SHORT).show();
运行单击其中的一行效果如下图:
- ListView组件的使用
- ListView组件的使用
- ListView组件的使用
- ListView组件的使用
- Adnroid组件的使用:ListView与GridView
- 【android】5.listview组件的使用(重要!)
- TabHost组件和ListView组件的结合使用
- ListView组件使用
- 组件使用之ListView
- 组件的使用(二)ListView的使用
- ListView组件的应用
- android的listView组件
- Android系列教程之八:ListView组件的使用
- Android系列教程之八:ListView组件的使用
- Tab组件与ListView组件的应用
- Android:ListView组件的优化
- 最常用的组件ListView
- React Native的组件ListView
- jsp表单提交中文参数乱码
- 数据导出Excel
- DATALIST嵌套datalist,要求只查询一次数据库
- SWTableView 不支持Retina Display的bug修复
- SSL Ettercap Filter
- ListView组件的使用
- 身份证检验算法,以及15位和18位身份证的相互转换!
- solr调用 java php
- <高性能JavaScript>笔记 [7~10]
- hdu 1166 敌兵布阵(线段树——单点更新)
- spring 3.0 + ibatis 2 整合
- 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
- 配置ASP.NET平台时遇到的“访问IIS元数据库失败”--解决方案
- sql 函数实现三种父子递归