Android定制ListView的界面(使用继承自ArrayAdapter的自定义适配器)--《第一行代码Android》学习笔记

ListView控件用于实现程序中的内容在屏幕上滚动的效果,大部分日常使用的应用程序都会使用ListView控件。

一、简单ListView的用法

简单ListView,即实现只有多个文本内容的滚动显示(不含有图片)。效果如图…

Android定制ListView的界面(使用继承自ArrayAdapter的自定义适配器)--《第一行代码Android》学习笔记_第1张图片

关键代码如下:

ArrayAdapter adapter = new ArrayAdapter(
        MainActivity.this, android.R.layout.simple_list_item_1, data);  //新建适配器
ListView listView = (ListView) findViewById(R.id.list_View);
listView.setAdapter(adapter);   //加载适配器

首先需要在主布局文件中加入ListView控件,然后希望将数据传递给ListView。然而数据的传递必须借助“适配器(Adapter)”来完成,在这里使用android.widget.ArrayAdapterArrayAdapter在定义时需要指定泛型为”要适配的数据类型“,这里即为String类型。

查阅API可知,共有6种重载形式的 ArrayAdapter 构造函数,由于想要传入的数据源data为字符串数组类型,所以应选择ArrayAdapter(Context context, int resource, T[] objects)并将泛型T指定为String,这样,该构造函数接受的形参为String[] objects符合我们的要求。注意,是先有要适配的数据,然后根据数据类型选择正确的构造函数。

从接收数组类型的参数上来看,还有一个符合要求的构造函数ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects),我们不使用它的原因是,并不需要这么多参数。这四个参数的含义依次为:

  • Context context:当前上下文(我的理解是:当前代码需要工作中哪个活动中,就传入哪个活动)

  • int resource:ListView的每一个列表项(子项)的布局文件(对于简单ListView来说,子项为布局为TextView纯文本,Android已内置这种布局文件,不需自行创建XML文件)

  • int textViewResourceId:子项布局中用来显示文字的TextView的id(在自定义ListView中,子项布局可能是一个图片ImageView和一个文本TextView,这里要传入TextView的ID)

  • T[] objects:泛型数组,指定泛型后变为相应类型的数组


二、自定义ListView的方法

自定义ListView可以实现每一个列表项都有图片和文字等复杂样式

在简单ListView中,我们使用了三种Android中现成的代码:String类、子项布局文件、ArrayAdapter适配器。在复杂布局中,这些现成代码不能满足要求,所以首先我们应重写这三部分代码。

  • String类 -> 自定义 Fruit类,这个类作为ListView适配器的适配类型。在简单布局中,子项为文本内容,所以使用String;在复杂布局中,子项为图片+文本,没有现成的类型可用,所以自定义Fruit类,在Fruit类中定义用于记录文本的String类型变量,和用于记录图片ID的int类型变量。
    public class Fruit {
        private String name;
        private int imageId;

        //通过构造函数完成初始化
        public Fruit(String name, int imageId) {
            this.name = name;
            this.imageId = imageId;
        }

        public String getName() {
            return name;
        }

        public int getImageId() {
            return imageId;
        }
    }
  • android.R.layout.simple_list_item_1布局 -> 自定义 fruit_item.xml布局

  • ArrayAdapter -> 自定义 FruitAdapter,这一项是最为复杂。

    ArrayAdapter默认的布局文件里只含有一个textview,然后它把接受到的数据toString后(即调用数据对象的toString方法)展示在textView里。如果要显示非文本内容,就要自定义适配器并重写getView方法

    首先要考虑子类FruitArray应覆盖ArrayAdapter的哪一个构造函数,ArrayAdapter共有6种重载形式的构造函数,选择哪一个构造函数是根据打算传入的实参类型而决定的

    在这本书中,传入的实参为ArrayList型数组(private List fruitList = new ArrayList();)所以相应的,选择第5个构造函数ArrayAdapter(Context context, int resource, List objects),不选择第6个ArrayAdapter(Context context, int resource, int textViewResourceId, List objects)的原因是我们不需要textViewResourceId,这个“子项布局中用来显示文字的TextView的id”参数。(使用这个构造函数也完全没问题,只是会发现textViewResourceId参数用不上)

    • 这里书中有一个小瑕疵,根据Android官方API构造函数的标准形式,没有书中的那个构造函数,书中构造函数的第二个参数textViewResourceId应命名为resource。不过形参的命名并不会影响程序的正确执行,只是容易造成误解而已。

    解决了构造函数的问题,接下来就是重写getView()方法了,每当有新的子项滚入屏幕时,getView()方法都会被调用。

你可能感兴趣的:(Android)