zoukankan      html  css  js  c++  java
  • Spinner的深入学习

    简介:

      spinner是一个列表选择框,会在用户选择后,展示一个列表供用户进行选择。Spinner是ViewGroup的间接子类,它和其他的Android控件一样,数据需要使用Adapter进行封装。

      下面介绍一下Spinner的常用XML属性,Android也为其属性提供了相应的getter、setter方法:

    • android:spinnerMode:列表显示的模式,有两个选择,为弹出列表(dialog)以及下拉列表(dropdown),如果不特别设置,为下拉列表。。
    • android:entries:使用<string-array.../>资源配置数据源。
    • android:prompt:对当前下拉列表设置标题,仅在dialog模式下有效。传递一个“@string/name”资源,需要在需要在资源文件中定义<string.../>。

      作为一个列表选择控件,Spinner具有一些选中选项可以触发的事件,但它本身没有定义这些事件,均继承自间接父类AdapterView。Spinner支持的几个常用事件有以下几个:

    • AdapterView.OnItemCLickListener:列表项被点击时触发。
    • AdapterView.OnItemLongClickListener:列表项被长按时触发。
    • AdapterView.OnItemSelectedListener:列表项被选择时触发。

      PS:因为适配器可以设置各种不同的样式,有选择、单选、多选,所以OnItemCLickListener和OnItemSelectedListener是适用于不同场景的。

    数据绑定:

     对于Spinner展示的数据源,一般使用两种方式设定数据:

    • 通过XML资源文件设置,这种方式比较死板,但是如果仅仅需要展示固定的、简单的数据,这种方式还是可以考虑的,比较直观。
    • 使用Adapter接口设置,这是最常见的方式,动态、灵活,可以设定各种样式以及数据来源。

      先来讲讲通过XML资源文件设置Spinner数据的方式,首先需要在/res/values目录下新建XML格式的资源文件,名字不重要,但是一般会使用strings.xml。在其中的<resourse.../>标签下,定义<string-array.../>标签,通过它中的<item.../>标签来设置选择数据。

      XML文件结构:

      <resource>

        <string-array name="arrayname">

          <item>item1</item>

          <item>item2</item>

          <item>item3</item>

        </string-array>

      <resource>

    布局代码:

     <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6 
     7     <TextView
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:text="弹出的Spinner" />
    11 
    12     <Spinner
    13         android:id="@+id/spinnerBase"
    14         android:layout_width="match_parent"
    15         android:layout_height="wrap_content"
    16         android:spinnerMode="dialog" />
    17 
    18     <TextView
    19         android:layout_width="wrap_content"
    20         android:layout_height="wrap_content"
    21         android:text="下拉的Spinner(默认)" />
    22 
    23     <Spinner
    24         android:id="@+id/spinnerBase1"
    25         android:layout_width="match_parent"
    26         android:layout_height="wrap_content"
    27         android:spinnerMode="dropdown" />
    28 
    29     <TextView
    30         android:layout_width="wrap_content"
    31         android:layout_height="wrap_content"
    32         android:text="entries绑定数据源" />
    33 
    34     <Spinner
    35         android:id="@+id/spinnerBase2"
    36         android:layout_width="match_parent"
    37         android:layout_height="wrap_content"
    38         android:entries="@array/beijing" />
    39 
    40     <TextView
    41         android:layout_width="wrap_content"
    42         android:layout_height="wrap_content"
    43         android:text="弹出带标题的Dialog,并且使用entries绑定数据源" />
    44 
    45     <Spinner
    46         android:id="@+id/spinnerBase3"
    47         android:layout_width="match_parent"
    48         android:layout_height="wrap_content"
    49         android:entries="@array/beijing"
    50         android:prompt="@string/beij_prompt"
    51         android:spinnerMode="dialog" />
    52 
    53 </LinearLayout>

    List数据:
    <?xml version="1.0" encoding="utf-8"?>
     2 <resources>
     3     <string name="app_name">SpinnerDemo</string>
     4     <string name="action_settings">Settings</string>
     5     <string name="hello_world">Hello world!</string>
     6     <string name="beij_prompt">北京区域</string> 
     7     <string-array name="beijing">
     8         <item>朝阳区</item>
     9         <item>海淀区</item>
    10         <item>房山区</item>
    11         <item>丰台区</item>
    12         <item>东城区</item>
    13         <item>西城区</item>
    14     </string-array>    
    15 </resources>


    主代码:
    1 package com.bgxt.datatimepickerdemo;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import android.app.Activity;
     7 import android.os.Bundle;
     8 import android.view.View;
     9 import android.widget.AdapterView;
    10 import android.widget.AdapterView.OnItemSelectedListener;
    11 import android.widget.ArrayAdapter;
    12 import android.widget.Spinner;
    13 import android.widget.Toast;
    14 
    15 public class SpinnerBaseActivity extends Activity {
    16     private Spinner spinner1, spinner2;
    17 
    18     @Override
    19     protected void onCreate(Bundle savedInstanceState) {
    20         super.onCreate(savedInstanceState);
    21         setContentView(R.layout.activity_spinnerbase);
    22 
    23         spinner1 = (Spinner) findViewById(R.id.spinnerBase);
    24         spinner2 = (Spinner) findViewById(R.id.spinnerBase1);
    25         // 声明一个ArrayAdapter用于存放简单数据
    26         ArrayAdapter<String> adapter = new ArrayAdapter<String>(
    27                 SpinnerBaseActivity.this, android.R.layout.simple_spinner_item,
    28                 getData());
    29         // 把定义好的Adapter设定到spinner中
    30         spinner1.setAdapter(adapter);
    31         spinner2.setAdapter(adapter);
    32         // 为第一个Spinner设定选中事件
    33         spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
    34 
    35             @Override
    36             public void onItemSelected(AdapterView<?> parent, View view,
    37                     int position, long id) {
    38                 // 在选中之后触发
    39                 Toast.makeText(SpinnerBaseActivity.this,
    40                         parent.getItemAtPosition(position).toString(),
    41                         Toast.LENGTH_SHORT).show();
    42             }
    43 
    44             @Override
    45             public void onNothingSelected(AdapterView<?> parent) {
    46                 // 这个一直没有触发,我也不知道什么时候被触发。
    47                 //在官方的文档上说明,为back的时候触发,但是无效,可能需要特定的场景
    48             }
    49         });
    50 
    51     }
    52 
    53     private List<String> getData() {
    54         // 数据源
    55         List<String> dataList = new ArrayList<String>();
    56         dataList.add("北京");
    57         dataList.add("上海");
    58         dataList.add("南京");
    59         dataList.add("宜昌");
    60         return dataList;
    61     }
    62 
    63 }

    spinner

    spinner

    
    
    你必须非常努力,才能看起来毫不费力。。。
  • 相关阅读:
    NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
    你真的了解Ioc与AOP吗?(1)
    C#网络编程TCP通信的粘包问题讨论
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
    NHibernate从入门到精通系列(1)——NHibernate概括
    Spring.NET框架简介及模块说明
    C#|.NET从控制反转(依赖注入)想到事件注入 (非AOP)
    MVC3使用Unity实现接口自动注册
    编写更好的C#代码
    解构控制反转(IoC)和依赖注入(DI)
  • 原文地址:https://www.cnblogs.com/yiweiaimeng/p/4933461.html
Copyright © 2011-2022 走看看