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 }

运行效果:

原文地址:https://www.cnblogs.com/zhengweicong/p/3209306.html