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 }
运行效果: