• Android组件的使用:AutoCompleteTextView、Spinner


    1、Spinner的使用:

     1.1新建一个布局文件spinner_layout.xml文件,添加一个Spinner控件,只要在组件中添加一个属性android:entries="@array/资源文件中的名字"代码如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout      -->定义线性布局管理器
     3     xmlns:android="http://schemas.android.com/apk/res/android"     -->引入命名空间
     4     android:layout_width="match_parent"                            -->设置布局管理器宽度为屏幕宽度
     5     android:layout_height="match_parent"                           -->设置布局管理器高度为屏幕高度
     6     android:orientation="vertical" >                               -->设置布局管理器中的内容为垂直显示
     7     <!-- Spinner组件 -->
     8     <Spinner         -->定义Spinner控件
     9         android:id="@+id/s_stu_name"             -->设置组件id
    10         android:layout_width="match_parent"      -->设置组件宽度为父容器宽度
    11         android:layout_height="wrap_content"     -->设置组件高度为包裹内容高度
    12         android:entries="@array/s_stuname"/>     -->设置Spinner下拉列表内容,表示从arrays.xml中读取,
    13 </LinearLayout>

    定义一个资源文件arrays.xml,该文件中保存一些数组信息,代码如下:

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <resources>
    3     <string-array name="s_stuname">   -->定义数组,标签名必须为string-array
    4         <item>张三</item>
    5         <item>李四</item>
    6         <item>王五</item>
    7         <item>赵六</item>
    8     </string-array>
    9 </resources>

     定义SpinnerDemoActivity类并设置布局管理器,代码如下:

     1 package com.example.basiccomponent2;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 
     6 public class SpinnerDemoActivity extends Activity {
     7     @Override
     8     protected void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10         super.setContentView(R.layout.spinner_layout);//设置布局管理器
    11     }
    12 }

    运行效果如下:

    以上效果是通过一个属性android:entries="@array/字符串名字",来实现的,下面通过代码来实现以上效果,去掉spinner_layout.xml中的此属性,代码如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout 
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7     <!-- Spinner组件 -->
     8     <Spinner
     9         android:id="@+id/s_stu_name"
    10         android:layout_width="match_parent"
    11         android:layout_height="wrap_content"/>
    12 </LinearLayout>

    要想实现此效果,必须借助SpinnerAdapter才能实现。而通过观察SpinnerAdapter是一个接口,BaseAdapter类实现了此接口,所以只要重新定义一个类继承BaseAdapter类,就可以覆写相应的方法实现数据加载。

    public abstract class
        BaseAdapter
        extends Object
        implements ListAdapter SpinnerAdapter

     新建一个类SpinnerDemoAdapter继承BaseAdapter,此时需要覆写一下方法:

     1     @Override
     2     public int getCount() {//表示获得总列表项数
     3         return 0;
     4     }
     5 
     6     @Override
     7     public Object getItem(int arg0) {//获得列表项
     8         return null;
     9     }
    10 
    11     @Override
    12     public long getItemId(int arg0) {//获得列表项id
    13         return 0;
    14     }
    15 
    16     @Override
    17     public View getView(int arg0, View arg1, ViewGroup arg2) {//获得view
    18         return null;
    19     }

     暂时只需要覆写以下两个方法:

     public int getCount() {//表示获得总列表项数
            return 0;
     }
    public View getView(int arg0, View arg1, ViewGroup arg2) {//获得view
             return null;
    }
    Spinner子列表的内容为TextView,为此新建一个spinner_extra_layout.xml文件,在文件中只建立一个组件TextView。代码如下:
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout 
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7     
     8     <TextView 
     9         android:id="@+id/tv_showspinneritem"
    10         android:layout_width="match_parent"
    11         android:layout_height="wrap_content"/>
    12 </LinearLayout>

    接下来在SpinnerDemoAdapter类中声明三个属性,用于接收构造函数传过来的参数。构造函数初始化这三个属性。

    1     //定义上下文参数,用于接受传过来的Activity类
    2     private Context context;
    3     //定义资源文件id,用于接收传过来的布局文件
    4     private int resource;
    5     //定义数组,用于接收传过来的数组数据
    6     private String str[];    

    完整代码如下:

     1 package com.example.adapter;
     2 
     3 import android.content.Context;
     4 import android.view.View;
     5 import android.view.ViewGroup;
     6 import android.widget.BaseAdapter;
     7 import android.widget.TextView;
     8 
     9 public class SpinnerDemoAdapter<T> extends BaseAdapter {
    10     //定义上下文参数,用于接受传过来的Activity类
    11     private Context context;
    12     //定义资源文件id,用于接收传过来的布局文件
    13     private int resource;
    14     //定义数组,用于接收传过来的数组数据
    15     private String str[];
    16     //重载构造方法
    17     public SpinnerDemoAdapter(Context context,int resource,String str[]){
    18         this.context = context;
    19         this.resource = resource;
    20         this.str = str;
    21     }
    22     @Override
    23     public int getCount() {//表示获得总列表项数
    24         //如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空
    25         if(str!=null){
    26             return str.length;
    27         }
    28         return 0;
    29     }
    30 
    31     @Override
    32     public Object getItem(int arg0) {//获得列表项
    33         return null;
    34     }
    35 
    36     @Override
    37     public long getItemId(int arg0) {//获得列表项id
    38         return 0;
    39     }
    40 
    41     @Override
    42     public View getView(int position, View convertView, ViewGroup parent) {//获得view
    43         //把传过来的Activity类,加载到TextView中
    44         TextView tv_item = new TextView(context);
    45         //把数组中的的数据加载到TextView中
    46         tv_item.setText(str[position]);
    47         return tv_item;
    48     }
    49 
    50 }

    SpinnerDemoActivity类完整代码如下:

     1 package com.example.basiccomponent2;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.widget.Spinner;
     6 
     7 import com.example.adapter.SpinnerDemoAdapter;
     8 
     9 public class SpinnerDemoActivity extends Activity {
    10     private Spinner s_stu_name = null;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         super.setContentView(R.layout.spinner_layout);// 设置布局管理器
    16         // 获得组件id
    17         s_stu_name = (Spinner) super.findViewById(R.id.s_stu_name);
    18         // 获得资源文件中的数组
    19         String str[] = this.getResources().getStringArray(R.array.s_stuname);
    20         /*
    21          *  通过SpinnerDemoAdapter类完成数据加载:
    22          *  1、Context context:表示Activity上下文
    23          *  2、int textViewResourceId:表示布局文件中的组件id
    24          *  3、T[] objects:表示数组类型数据
    25          */
    26         SpinnerDemoAdapter<String> adapter = new SpinnerDemoAdapter<String>(SpinnerDemoActivity.this,R.id.tv_showspinneritem, str);
    27         //为组件加载ArrayAdapter
    28         s_stu_name.setAdapter(adapter);
    29     }
    30 }

     实现效果:

     spinner_extra_layout.xml里面只有一个TextView组件,所以可以通过TextView tv_item = new TextView(context)实例化一个TextView,接下来换成convertView.findViewById完成,修改SpinnerDemoAdapter类。
    完整代码:
     1 package com.example.adapter;
     2 
     3 import android.content.Context;
     4 import android.view.LayoutInflater;
     5 import android.view.View;
     6 import android.view.ViewGroup;
     7 import android.view.ViewGroup.LayoutParams;
     8 import android.widget.AbsListView;
     9 import android.widget.BaseAdapter;
    10 import android.widget.LinearLayout;
    11 import android.widget.TextView;
    12 
    13 import com.example.basiccomponent2.R;
    14 
    15 public class SpinnerDemoAdapter<T> extends BaseAdapter {
    16     //定义上下文参数
    17     private Context context;
    18     //定义资源文件组件id
    19     private int resource;
    20     //定义数组
    21     private String str[];
    22     //定义
    23     private LayoutInflater inflater;
    24     //重载构造方法
    25     public SpinnerDemoAdapter(Context context,int resource,String str[]){
    26         this.context = context;
    27         this.resource = resource;
    28         this.str = str;
    29         inflater = LayoutInflater.from(context);//初始化LayoutInflater
    30     }
    31     @Override
    32     public int getCount() {//表示获得总列表项数
    33         //如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空
    34         if(str!=null){
    35             return str.length;
    36         }
    37         return 0;
    38     }
    39 
    40     @Override
    41     public Object getItem(int arg0) {//获得列表项
    42         return null;
    43     }
    44 
    45     @Override
    46     public long getItemId(int arg0) {//获得列表项id
    47         return 0;
    48     }
    49 
    50     @Override
    51     public View getView(int position, View convertView, ViewGroup parent) {//获得view
    52         if(convertView==null){
    53             convertView=inflater.inflate(resource, null);
    54         }
    55         
    56         //TextView tv_item = new TextView(context);
    57         TextView tv_item = (TextView) convertView.findViewById(R.id.tv_showspinneritem);
    58         int p = position%str.length;
    59 
    60         tv_item.setText(str[p]);
    61         return convertView;
    62     }
    63 
    64 }

    运行效果同上。

     接下来在Spinner的下拉列表中设置图片,即在下拉文本前面加入图片。

    完整代码:

     1 package com.example.adapter;
     2 
     3 import android.content.Context;
     4 import android.view.LayoutInflater;
     5 import android.view.View;
     6 import android.view.ViewGroup;
     7 import android.widget.BaseAdapter;
     8 import android.widget.ImageView;
     9 import android.widget.TextView;
    10 
    11 import com.example.basiccomponent2.R;
    12 
    13 public class SpinnerDemoAdapter<T> extends BaseAdapter {
    14     // 定义上下文参数
    15     private Context context;
    16     // 定义资源文件组件id
    17     private int resource;
    18     // 定义数组
    19     private String str[];
    20     // 定义
    21     private LayoutInflater inflater;
    22     // 定义图片id数组
    23     int icon[] = {
    24             R.drawable.d1,
    25             R.drawable.d2,
    26             R.drawable.d3 
    27     };
    28 
    29     // 重载构造方法
    30     public SpinnerDemoAdapter(Context context, int resource, String str[]) {
    31         this.context = context;
    32         this.resource = resource;
    33         this.str = str;
    34         inflater = LayoutInflater.from(context);// 初始化LayoutInflater
    35     }
    36 
    37     @Override
    38     public int getCount() {// 表示获得总列表项数
    39         // 如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空
    40         if (str != null) {
    41             return str.length;
    42         }
    43         return 0;
    44     }
    45 
    46     @Override
    47     public Object getItem(int arg0) {// 获得列表项
    48         return null;
    49     }
    50 
    51     @Override
    52     public long getItemId(int arg0) {// 获得列表项id
    53         return 0;
    54     }
    55 
    56     @Override
    57     public View getView(int position, View convertView, ViewGroup parent) {// 获得view
    58         if (convertView == null) {
    59             convertView = inflater.inflate(resource, null);
    60         }
    61         int i = position % icon.length;// 防止加入的图片越界
    62         int t = position % str.length;
    63         // 获得spinner_extra_layout.xml中TextView的id
    64         TextView tv_item = (TextView) convertView.findViewById(R.id.tv_showspinneritem);
    65         // 获得spinner_extra_layout.xml中ImageView的id
    66         ImageView iv_item = (ImageView) convertView.findViewById(R.id.iv_showspinnerimage);
    67         iv_item.setImageResource(icon[i]);// 把每一个图片设置到Spinner下拉列表中
    68         tv_item.setText(str[t]); // 把每一个文本设置到Spinner下拉列表中
    69         return convertView;
    70     }
    71 
    72 }

    运行效果:

    2、AutoCompleteTextView的使用

    2.1新建一个布局文件autocompletetextview_layout.xml文件,代码如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout 
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7     
     8     <AutoCompleteTextView
     9         android:id="@+id/actv_1"
    10         android:layout_width="match_parent"
    11         android:layout_height="wrap_content"
    12         android:completionThreshold="1"/>
    13 </LinearLayout>

    新建一个arrays.xml文件,保存数组信息。

    1 <?xml version="1.0" encoding="utf-8"?>
    2 <resources>
    3     <string-array name="s_stuname">
    4         <item>z张三</item>
    5         <item>l李四</item>
    6         <item>w王五</item>
    7         <item>z赵六</item>
    8     </string-array>
    9 </resources>

    新建一个类AutoCompleteTextViewDemoActivity 继承Activity,并覆写onCreate()方法,代码如下:

     1 package com.example.autocompletetextviewdemo;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.widget.ArrayAdapter;
     6 import android.widget.AutoCompleteTextView;
     7 
     8 public class AutoCompleteTextViewDemoActivity extends Activity {
     9     //声明一个AutoCompleteTextView对象
    10     private AutoCompleteTextView actv_1 = null;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         //初始化布局管理器
    16         setContentView(R.layout.activity_main);
    17         //初始化AutoCompleteTextView组件
    18         actv_1 = (AutoCompleteTextView)super.findViewById(R.id.actv_1);
    19         //得到arrays.xml中的数组
    20         String str[] = this.getResources().getStringArray(R.array.stu_arr);
    21         //借助ArrayAdapter类把数组加载到AutoCompleteTextView中
    22         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,str);
    23         //设置适配器
    24         actv_1.setAdapter(adapter);
    25     }
    26 }

    在文本框中输入z字母,运行效果提示为:

    2.2新建一个文件autocompletetextview_extra_layout.xml,

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout 
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7     
     8     <TextView 
     9         android:id="@+id/tv_showactvitem"
    10         android:layout_width="wrap_content"
    11         android:layout_height="wrap_content"/>
    12 </LinearLayout>

    通过LayoutInflater类把数组中的数据加载在autocompletetextview_extra_layout.xml中,然后再把整个文件中的内容加载到AutoCompleteTextView中去。

    AutoCompleteTextViewDemoActivity 类:
     1 package com.example.basiccomponent2;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.widget.AutoCompleteTextView;
     6 
     7 import com.example.adapter.ACTVArrayAdapter;
     8 
     9 public class AutoCompleteTextViewDemoActivity extends Activity {
    10     private AutoCompleteTextView actv_showinfo = null;
    11 
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         super.setContentView(R.layout.autocompletetextview_layout);
    16         //获得AutoCompleteTextView组件id
    17         actv_showinfo = (AutoCompleteTextView) super.findViewById(R.id.actv_showinfo);
    18         //得到数组数据
    19         String str[] = getResources().getStringArray(R.array.s_stuname);
    20         /*实例化自定义Adapter,
    21          * Context context:第一个参数表示上下文
    22          * int resource:表示新建的autocompletetextview_extra_layout.xml文件
    23          * int textviewResourceId:表示新建的autocompletetextview_extra_layout.xml文件中的TextView组件id
    24          * Object objects[]:表示要传入的数组数据
    25          */
    26         ACTVArrayAdapter adapter = new ACTVArrayAdapter(AutoCompleteTextViewDemoActivity.this,
    27                 R.layout.autocompletetextview_extra_layout,R.id.tv_showactvitem,str);
    28         //设置AutoCompleteTextView组件的id的适配器
    29         actv_showinfo.setAdapter(adapter);
    30     }
    31 }

    新建一个Adapter类。

     1 package com.example.adapter;
     2 
     3 import android.content.Context;
     4 import android.util.Log;
     5 import android.view.LayoutInflater;
     6 import android.view.View;
     7 import android.view.ViewGroup;
     8 import android.widget.ArrayAdapter;
     9 import android.widget.TextView;
    10 
    11 import com.example.basiccomponent2.R;
    12 
    13 public class ACTVArrayAdapter extends ArrayAdapter {
    14     private Context context;//表示上下文,即要传过来的Activity类
    15     private int resource;    //表示资源文件,即要传入的新建的xml文件
    16     private int textViewResourceId;//表示资源文件中的组件id,即要传入的新建的xml文件中组件的id
    17     private Object str[];            //表示要传过来的数组,
    18     private LayoutInflater inflater;//表示要把xml中的数据要加载到AutoCompleteTextView中借助的类。
    19 
    20     public ACTVArrayAdapter(Context context, int resource,
    21             int textViewResourceId, Object[] objects) {
    22         super(context, resource, textViewResourceId, objects);
    23         this.context = context;
    24         this.resource = resource;
    25         this.textViewResourceId=textViewResourceId;
    26         this.str = objects;
    27         inflater = LayoutInflater.from(context);//实例化LayoutInflater
    28     }
    29 
    30     @Override
    31     public View getView(int position, View convertView, ViewGroup parent) {
    32         if (convertView == null) {
    33             // 把指定的布局文件转换成view
    34             convertView = inflater.inflate(resource, null);
    35         }
    36         //传过来的资源文件中的组件id,通过TextView来接收
    37         TextView tv_item = (TextView) convertView.findViewById(textViewResourceId);
    38         int p = position%str.length;//防止数组越界
    39         //把数组中的数据设置到autocompletetextview_extra_layout.xml中的TextView中,
    40         //然后再加载到AutoCompleteTextView组件中
    41         tv_item.setText(""+str[p]);
    42         return super.getView(position, convertView, parent);
    43     }
    44 }

    运行效果:

    2.3如果要在文字的前面加入图片,则需要定义一个自己的Adapter继承ArrayAdapter类,并覆写构造方法和getView()方法,

    在之前的自定义ACTVArrayAdapter 类中加载的AutoCompleteTextView组件中的数据前加入图片,

    需要在autocompletetextview_extra_layout.xml中加入图片组件用于加载图片,代码如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout 
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent"
     6     android:orientation="vertical" >
     7     <ImageView 
     8         android:id="@+id/iv_shouwactvitemimage"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"/>
    11     <TextView 
    12         android:id="@+id/tv_showactvitem"
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"/>
    15 </LinearLayout>

    在ACTVArrayAdapter中添加图片id信息,并加载到AutoCompleteTextView中。

    1 //定义一个图片id数组用于保存图片id
    2     int icon[] = {
    3             R.drawable.d1,
    4             R.drawable.d2,
    5             R.drawable.d3
    6     };

    完整代码:

     1 package com.example.adapter;
     2 
     3 import android.content.Context;
     4 import android.view.LayoutInflater;
     5 import android.view.View;
     6 import android.view.ViewGroup;
     7 import android.widget.ArrayAdapter;
     8 import android.widget.ImageView;
     9 import android.widget.TextView;
    10 
    11 import com.example.basiccomponent2.R;
    12 
    13 public class ACTVArrayAdapter extends ArrayAdapter {
    14     private Context context;//表示上下文,即要传过来的Activity类
    15     private int resource;    //表示资源文件,即要传入的新建的xml文件
    16     private int textViewResourceId;//表示资源文件中的组件id,即要传入的新建的xml文件中组件的id
    17     private Object str[];            //表示要传过来的数组,
    18     private LayoutInflater inflater;//表示要把xml中的数据要加载到AutoCompleteTextView中借助的类。
    19     //定义一个图片id数组用于保存图片id
    20     int icon[] = {
    21             R.drawable.d1,
    22             R.drawable.d2,
    23             R.drawable.d3
    24     };
    25     public ACTVArrayAdapter(Context context, int resource,
    26             int textViewResourceId, Object[] objects) {
    27         super(context, resource, textViewResourceId, objects);
    28         this.context = context;
    29         this.resource = resource;
    30         this.textViewResourceId=textViewResourceId;
    31         this.str = objects;
    32         inflater = LayoutInflater.from(context);//实例化LayoutInflater
    33     }
    34 
    35     @Override
    36     public View getView(int position, View convertView, ViewGroup parent) {
    37         if (convertView == null) {
    38             // 把指定的布局文件转换成view
    39             convertView = inflater.inflate(resource, null);
    40         }
    41         //传过来的资源文件中的组件id,通过TextView来接收
    42         TextView tv_item = (TextView) convertView.findViewById(textViewResourceId);
    43         int p = position%str.length;//防止数组越界
    44         //把数组中的数据设置到autocompletetextview_extra_layout.xml中的TextView中,
    45         //然后再加载到AutoCompleteTextView组件中
    46         tv_item.setText(""+str[p]);
    47         //获得autocompletetextview_extra_layout.xml中的ImageView组件id
    48         ImageView iv_item =(ImageView)convertView.findViewById(R.id.iv_shouwactvitemimage);
    49         //防止数组越界
    50         int i = position%icon.length;
    51         //把图片加载到ImageView中
    52         iv_item.setImageResource(icon[i]);
    53         return super.getView(position, convertView, parent);
    54     }
    55 }

    运行效果:

  • 相关阅读:
    sharepoint 2010 无法停止爬网 金大昊(jindahao)
    自定义搜索核心结果 金大昊(jindahao)
    fast search 爬网倒计时 金大昊(jindahao)
    workspace 限制 金大昊(jindahao)
    权限级别“打开项目”影响搜索结果 金大昊(jindahao)
    sharepoint 多服务器部署错误 金大昊(jindahao)
    大列表读取 金大昊(jindahao)
    sharepoint web servcie 金大昊(jindahao)
    SharePoint:pdf加密(RMS)方案 金大昊(jindahao)
    Infopath form to HTML using csharp 金大昊(jindahao)
  • 原文地址:https://www.cnblogs.com/zhengweicong/p/3209306.html
Copyright © 2020-2023  润新知