安卓高级控件(下拉框、列表类视图、翻页类视图、碎片Fragment)

下拉框

此小节介绍下拉框的用法以及适配器的基本概念,结合对下拉框Spinner的使用说明分别阐述数组适配器ArrayAdapter、简单适配器SimpleAdapter的具体用法与展示效果。

下拉框控件Spinner

Spinner是下拉框控件,它用于从一串列表中选择某项,其功能类似于单选按钮的组合。下拉列表的展示方法有两种,一种是在当前下拉框的正下方弹出列表框,此时要把spinnerMode属性设置为dropdown,下面是XML文件中采取下拉模式的Spinner标签例子:

<Spinner
    android:id="@+id/sp_dropdown"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:spinnerMode="dropdown" />

另一种是在页面中部弹出列表对话框,此时要把spinnerMode属性设置成dialog,下面是XML文件中采取对话框模式的Spinner标签例子:

<Spinner
    android:id="@+id/sp_dropdown"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:spinnerMode="dialog" />

此外,在Java代码中,Spinner还可以调用下列4个方法。

  • setPrompt:设置标题文字。注意对话框模式才显示标题,下拉模式不显示标题。
  • setAdapter:设置列表项的数据适配器。
  • setSelection:设置当前选中哪项。注意该方法要在setAdapter方法后调用。
  • setOnItemSelectedListener:设置下拉列表的选择监听器,该监听器要实现接口AdapterView.OnItemSelectedListener。
    下面是初始化下拉框,并设置选择监听器的代码例子:
// 初始化下拉模式的列表框
private void initSpinnerForDropdown() {
   
   
    // 声明一个下拉表的数组适配器
    ArrayAdapter<String> starAdapter = new ArrayAdapter<>(this, R.layout.item_select, starArray);
    // 从布局文件中获取名为sp_dropdown的下拉框
    Spinner sp_dropdown = findViewById(R.id.sp_dropdown);
    // 设置下拉框的标题。对话框模式才显示标题,下拉模式不显示标题
    sp_dropdown.setPrompt("请选择行星");
    // 设置下拉框数组适配器
    sp_dropdown.setAdapter(starAdapter);
    // 设置下拉框默认选择第一个
    sp_dropdown.setSelection(0);
    // 给下拉框注册监听器,一旦用户选择某一项,就出发监听器的onItemSelected方法
    sp_dropdown.setOnItemSelectedListener(new MySelectedListener());
}

接下来观察两种下拉列表的界面效果,运行App,一开始的下拉框效果如下图:
在这里插入图片描述
在下拉模式页面(SpinnerDropdownActivity.java)单击下拉框,六大行星的列表在下拉框正下方展开。点击某项后,列表框消失,同时下拉框中的文字变为刚选中的行星名称。展开效果如下图:
在这里插入图片描述
spinnerMode属性设置成dialog,点击下拉框,则下拉框会弹出,如下图:
在这里插入图片描述

数组适配器ArrayAdapter

上一小节在演示下拉框时,调用了setAdapter方法设置列表适配器。这个适配器好比一组数据的加工流水线,你丢给它一大把糖果(六大行星的原始数据),适配器先按顺序排列糖果(对应行星数组starArray),然后拿来制作好的包装(对应每个列表项的布局文件item_select.xml),把糖果往里一塞,出来的便是一个个精美的糖果盒(界面上排布整齐的列表框)。这个流水线可以做得很复杂,也可以做得简单一些,最简单的流水线就是之前演示用到的数组适配器ArrayAdapter。
ArrayAdapter主要用于每行列表只展示文本的情况,实现过程分成下列3个步骤:

  1. 编写列表项的XML文件,内部布局只有一个TextView标签,示例如下:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_name"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:singleLine="true"
    android:gravity="center"
    android:textSize="17sp"
    android:textColor="#0000ff" />
  1. 调用ArrayAdapter的构造方法,填入待展现的字符串数组,以及列表项的包装盒,即XML文件R.layout.item_select。构造方法的调用代码示例如下:
// 声明一个下拉列表的数组适配器
ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this, R.layout.item_select, starArray);
  1. 调用下拉框控件的setAdapter方法,传入步骤2得到的适配器实例,代码如下:
sp_dialog.setAdapter(starAdapter); // 设置下拉框的数组适配器

经过以上3个步骤,先由ArrayAdapter明确原料糖果的分拣过程与包装方式,再由下拉框调用sertAdapter方法发出开工指令,适配器便会一个个包装好的糖果盒输出到界面。

简单适配器SimpleAdapter

ArrayAdapter只能显示文本列表,显然不够美观,有时还想给列表加上图标,比如希望显示六大行星的天文影像。这是简单适配器SimpleAdapter就排上用场了,它允许在列表项中同时展示文本与图片。
SimpleAdapter的实现过程略微复杂,因为它的原料需要更多信息。例如,原料不但有糖果,还有贺卡,这样就得把一大袋糖果和一大袋贺卡送进流水线,适配器每次拿一颗糖果和一张贺卡,把糖果与贺卡按规定塞进包装盒。对于SimpleAdapter的构造方法来说,第二个参数Map容器放的是原料糖果与贺卡,第三个参数放的是包装盒,第四个参数放的是糖果袋与贺卡袋的名称,第五个参数放的是包装盒里塞糖果的位置与塞贺卡的位置。
下面是下拉框控件使用简单适配器的示例代码:

// 初始化下拉框,演示简单适配器
private void initSpinnerForSimpleAdapter() {
   
   
    // 声明一个映射对象的列表,用于保存行星的图标与名称配对信息
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    // iconArray是行星的图标数组,starArray是行星的名称数组
    for (int i = 0; i < iconArray.length; i++) {
   
   
        Map<String, Object> item = new HashMap<String, Object>();
        item.put("icon", iconArray[i]);
        item.put("name", starArray[i]);
        list.add(item); // 把行星图标与名称的配对映射添加到列表
    }
    // 声明一个下拉列表的简单适配器,其中指定了图标与文本两组数据
    SimpleAdapter starAdapter = new SimpleAdapter(this, list,
            R.layout.item_simple, new String[]{
   
   "icon", "name"},
            new int[]{
   
   R.id.iv_icon, R.id.tv_name});
    // 设置简单适配器的布局样式
    starAdapter.setDropDownViewResource(R.layout.item_simple);
    // 从布局文件中获取名叫sp_icon的下拉框
    Spinner sp_icon = findViewById(R.id.sp_icon);
    sp_icon.setPrompt("请选择行星"); // 设置下拉框的标题
    sp_icon.setAdapter(starAdapter); // 设置下拉框的简单适配器
    sp_icon.setSelection(0); // 设置下拉框默认显示第一项
    // 给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法
    sp_icon.setOnItemSelectedListener(new MySelectedListener());
}

以上代码中,简单适配器使用的包装盒名为R.layout.item_simple,它的布局内容如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- 这是展示行星图标的ImageView -->
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1" />

    <!-- 这是展示行星名称的TextView -->
    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:gravity="center"
        android:textColor="#ff0000"
        android:textSize="17sp" />
</LinearLayout>

运行App,一开始显示的是默认选项的图片和文字,如下图:
在这里插入图片描述
点击下拉框,页面中央弹出六大行星的列表对话框,可见列表框的各项也一齐展示了行星的图标及其名称,如下图:
在这里插入图片描述

列表类视图

此节介绍列表类视图怎样结合基本适配器展示视图阵列,包括:基本适配器BaseAdapter的用法、列表视图ListView的用法及其常见问题的解决、网络视图GridView的用法及其拉伸模式说明。

基本适配器BaseAdapter

由上一节的介绍可知,数组适配器适用于纯文本的列表数据,简单适配器适用于带图标的列表数据。然而在实际应用中常常有更复杂的列表,比如每个列表项存在3个以上的控件,这种情况即便是简单适配器也很吃力,而且不易扩展。为此Android提供了一种适应性更强的基本适配器BaseAdapter,该适配器允许开发者在别的代码文件中编写操作代码,大大提高了代码的可读性和可维护性。
从BaseAdapter派生的数据适配器主要实现下面5个方法:

  • 构造方法:指定适配器需要处理的数据集合。
  • getCount:获取列表项的个数。
  • getItem:获取列表项的数据。
  • getItemId:获取列表项的编号。
  • getView:获取每项的展示视图,并对每项的内部控件进行业务处理。

下面以下拉框控件为载体,演示如何操作BaseAdapter,具体编码过程分为3步:

  1. 编写列表项的布局文件,示例代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- 这是显示行星图片的图像视图 -->
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="0dp"
        android:layout_height="80dp"
        android:layout_weight="1"
        android:scaleType="fitCenter" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:layout_marginLeft="5dp"
        android:orientation="vertical">

        <!-- 这是显示行星名称的文本视图 -->
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="left|center"
            android:textColor="@color/black"
            android:textSize="20sp" />

        <!-- 这是显示行星描述的文本视图 -->
        <TextView
            android:id="@+id/tv_desc"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:gravity="left|center"
            android:textColor="@color/black"
            android:textSize="13sp" />
    </LinearLayout>
</LinearLayout>
  1. 写个新的适配器继承BaseAdapter,实现对列表的管理操作,示例代码如下:
public class PlanetBaseAdapter extends BaseAdapter {
   
   
    private Context mContext; // 声明一个上下文对象
    private List<Planet> mPlanetList; // 声明一个行星信息列表

    // 行星适配器的构造方法,传入上下文与行星列表
    public PlanetBaseAdapter(Context context, List<Planet> planet_list) {
   
   
        mContext = context;
        mPlanetList = planet_list;
    }

    // 获取列表项的个数
    public int getCount() {
   
   
        return mPlanetList.size();
    }

    // 获取列表项的数据
    public Object getItem(int arg0) {
   
   
        return mPlanetList.get(arg0);
    }

    // 获取列表项的编号
    public long getItemId(int arg0) {
   
   
        return arg0;
    }

    // 获取指定位置的列表项视图
    public View getView(final int position, View convertView, ViewGroup parent) {
   
   
        ViewHolder holder;
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值