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