• Android精讲--界面编程5(AdapterView及其子类)


    列表视图(ListView)和ListActivity

    AdapterView组件是一组重要的组件,AdapterView本身是一个抽象基类,它派生的子类
    在用法上十分相似,只是显示界面有一定的区别,因此本节把它们归为一类,针对它们的共性集中讲解,并突出介绍它们的区别。
    AdapterView如下特征。

    • AdapterView继承了ViewGroup.它的本质是容器。
    • AdapterView可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来。
    • AdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)方法设置Adapter即可。

    AdapterView及其子类的继承关系图

    ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项。
    创建ListView有如下两种方式。

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

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

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

    # AbsListView常用XML属性

    XML属性                                                               相关方法                                                        说明

    android:choiceMode                                                                                                                 设置AbsListView的选择行为。该属性支持如下属性值。
                                                                                                                                                  none:不显示任何选中项
                                                                                                                                                  singleChoice:允许单选
                                                                                                                                                  multipleChoice:允许多选
                                                                                                                                                  multipleChoiceModal:允许多选

    android:drawSelectorOnTop                                  setDrawSelectorOnTop(boolean)                      如果该属性设为true,选中的列表项将会显示在上面

    android:fastScrollEnabled                                                                                                         设置是否允许快速滚动。如果该属性设为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动

    android:listSelector                                              setSelector(int)                                              指定被选中的列表项上绘制的Drawable

    android:scrollingCache                                                                                                              如果设为true,该组件在滚动时将会使用绘制缓存

    android:smoothScrollbar                                      setSmoothScrollbarEnabled(boolean)                如果设置为false,则不在header View之后绘制分割线

    android:stackFromBottom                                                                                                         设置是否从底端开始排列列表项

    android:textFilterEnabled                                                                                                          设置是否对列表项进行过滤。当该AbsListView对应的Adapter实现了Filter接口时该属性才会起作用

    android:transcriptMode                                                                                                            设置该组件的滚动模式。该属性支持如下属性值。
                                                                                                                                                 disable:关闭滚动。这是默认值          

                                                                                                                                                 normal:当该AbsListView受到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端
                                                                                                                                                 alwaysScroll:该AbsListView总会自动滚动到底端

    # ListView常用XML属性

    XML属性                                                                     说明

    android:divider                                                          设置List列表项的分隔条(即可用颜色分隔,也可用Drawable分隔)

    android:dividerHeight                                                设置分隔条的高度

    android:entries                                                         指定一个数组资源,Android将根据该数组资源来生成ListView

    android:footerDividersEnabled                                    如果设置为false,则不在footer View之前绘制分隔条

    android:headerDividersEnabled                                  如果设置为false,则不在header View之后绘制分隔条

    实例:改变分隔条、基于数组的ListView

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

    上面的界面布局中定义了一个ListView, 并通过android:entries指定了列表项数组,该ListView还通过android:divider改变了列表项之间的分隔条。
    上面第一个ListView指定了android:entries="@array/books",该属性值用到了数组资源,因此还需要在应用中定义一个名为books的数组,定义数组的资源文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
        <string-array name="books">
            <item>Java</item>
            <item>Ajax</item>
            <item>XML</item>
            <item>Android</item>
        </string-array>
    </resources>
    Adapter接口及实现类

    Adapter本身只是一个接口,它派生了ListAdapterSpinnerAdapter两个子接口,其中ListAdapterAbsListVlew提供列表项,而SpinnerAdapterAbsSpinner提供列表项。

    Adapter及其子类的继承关系图

    #Adapter常用的实现类如下

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

    # 实例:使用 ArrayAdapter创建 ListView

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

    上面的布局文件定义了两个ListView,但这两个ListView都没有指定android:entries属性,这意味着它们都需要通过Adapter来提供列表项。
    接下来Activity为两个ListView提供Adapter,Adapter决定ListView所显示的列表项。程序如下:

    package org.crazyit.ui;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    /**
     * Description:
     * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
     * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
     * <br/>This program is protected by copyright laws.
     * <br/>Program Name:
     * <br/>Date:
     * @author  Yeeku.H.Lee kongyeeku@163.com
     * @version  1.0
     */
    public class ArrayAdapterTest extends Activity
    {
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ListView list1 = (ListView) findViewById(R.id.list1);
            // 定义一个数组
            String[] arr1 = { "孙悟空", "猪八戒", "牛魔王" };
            // 将数组包装ArrayAdapter
            ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
                (this, R.layout.array_item, arr1);
            // 为ListView设置Adapter
            list1.setAdapter(adapter1);
            ListView list2 = (ListView) findViewById(R.id.list2);
            // 定义一个数组
            String[] arr2 = { "Java", "Hibernate", "Spring" , "Android" };
            // 将数组包装ArrayAdapter
            ArrayAdapter<String> adapter2 = new ArrayAdapter<String>
                (this, R.layout.checked_item, arr2);
            // 为ListView设置Adapter
            list2.setAdapter(adapter2); 
        }
    }

    通过ArrayAdapter实现Adapter虽然简单、易用,但ArrayAdapter的功能比较有限。它的每个列表项只能是TextView。如果开发者需要实现更复杂的列表项,则可以考虑使用SimpleAdapter,
    不要被SimpleAdapter的名字欺骗,SimpleAdapter并不简单,而且它的功能非常强大。ListView的大部分应用场景,都可以通过SimpleAdapter来提供列表项。

    自动完成文本框(AutoCompleteTextView)的功能和用法

    自动完成文本框(AutoCompleteTextView)从EditText派生而出,实际上它也是一个文本编辑框,但它比普通编辑框多了一个功能:当用户输入一定字符之后,自动完成文本框会
    显示一个下拉菜单,供用户从中选择,当用户选择某个菜单项之后,AutoCompleteTextView按用户选择自动填写该文本框。

    网格视图(GridView)功能和用法

    GridView用于在界面h按行、列分布的方式来显示多个组件。GridView和ListView有共同的父类:AbsListView,因此GridView和ListView具有很高的相似性,它们都是列表项。
    GridView与ListView的唯一区别在于:ListView只显示一列;而GridView可以显示多列。
    从这个角度来看,ListView相当于一种特殊的GridView,如果让GridView只显示一列,那么该GridView就变成了ListView。
    与ListView类似的是,GridView也需要通过Adapter来提供显示的数据:开发者可以采用上面介绍的4种方式中的任意一种来创建Adapter。不管使用哪种方式, GridView与ListView的用法是基本一致的。

    可展开的列表组件(ExpandableListView)

    ExpandableListView是ListView的子类,它在普通LislView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。
    ExpandableListView的用法与转通ListView的用法非常相似,只是ExpandableListView所显示的列表项应该由ExpandableListAdapter提供。

    ExpandableListAdapter及其子类的类图

    Spinner的功能和用法

    Spinner其实就是一个列表选择框,不过Android的列表选择框并不是需要显示下拉列表的,而是相当于弹出一个菜单供用户选择。
    Spinner与Gallery都继承了AbsSpinner,AbsSpinner继承了AdapterView,因此它也表现出AdapterView的特征:只要为AdapterView提供Adapter即可。

    画廊视图(Gallery)的功能和用法

    Gallery与Spinner组件有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框-它们之间的区别在于Spinner显示的是一个垂直的列表选择框,而Gallery显示的是一个水平的列表选择框。
    Gallery与Spinner还有一个区别:Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来査看上—个、下一个列表项。

    Android已经不再推荐使用Gallery组件,而是推荐使用其他水平滚动组件。如HorizontalScrollView和ViewPager来代替Gallery组件。因此在新版本的Android平台上应该尽量少用Gallery组件

    AdapterViewFlipper的功能与用法

    AdapterViewFilpper继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下—个组件。
    AdapterViewFilpper可以在多个View切换过程中使用渐隐渐现的动画效果,除此之外,还可以调用该组件的startFlipping()控制它“自动播放”下一个View组件。

    StackView的功能与用法

    StackView也是AdapterViewAnimator的子类,它也用于BI2.48使用AdapterViewFlipper显示Adapter提供的系列View。StackView将会以“堆赍实现自动播放图片(Stack)”方式来显示多个列表项,
    为了控制StackView显示的View组件,SlackView提供了如下两种控制方式。

    • 拖走StackView中处于顶端的View,F+-个View将会显示出来。将上一个View拖进StackView,将使之显示出来。
    • 通过调用StackView的showNext〇、showPrevious〇控制显示上一个、上一个组件。
    岁月本长而忙者自促;天地本宽而卑者自隘;风花雪月本闲,而劳忧者自冗;天行健,君子以自强不息;地势坤,君子以厚德载物;宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒.不妄取,不妄予,不妄想,不妄求,与人方便,随遇而安
  • 相关阅读:
    MT【319】分段递推数列
    MT【318】分式不等式双代换
    Centos7环境变量
    VI快捷键
    Centos7 开机自动运行命令
    Centos7 编辑本地DNS解析配置文件
    Centos7修改主机名
    xadmin 自定义过滤器选项
    Centos7网卡配置文件
    Centos7 挂载
  • 原文地址:https://www.cnblogs.com/vvning/p/9414886.html
Copyright © 2020-2023  润新知