Android组件的使用:AutoCompleteTextView、Spinner

Android组件的使用:AutoCompleteTextView(自动完成提示文本)、Spinner(下拉列表)


1、AutoCompleteTextView

1.1、

1)、 新建一个布局文件autocompletetextview_layout.xml文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <AutoCompleteTextView
        android:id="@+id/actv_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:completionThreshold="1"/>
</LinearLayout>
2)、 新建一个arrays.xml文件,保存数组信息。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="s_stuname">
        <item>z张三</item>
        <item>l李四</item>
        <item>w王五</item>
        <item>z赵六</item>
    </string-array>
</resources>

3)、 新建一个类AutoCompleteTextViewDemoActivity 继承Activity,并覆写onCreate()方法,代码如下:
package com.example.autocompletetextviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class AutoCompleteTextViewDemoActivity extends Activity {
    //声明一个AutoCompleteTextView对象
    private AutoCompleteTextView actv_1 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化布局管理器
        setContentView(R.layout.activity_main);
        //初始化AutoCompleteTextView组件
        actv_1 = (AutoCompleteTextView)super.findViewById(R.id.actv_1);
        //得到arrays.xml中的数组
        String str[] = this.getResources().getStringArray(R.array.stu_arr);
        //借助ArrayAdapter类把数组加载到AutoCompleteTextView中
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,str);
        //设置适配器
        actv_1.setAdapter(adapter);
    }
}

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


1.2、


1)、新建一个文件autocompletetextview_extra_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/tv_showactvitem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

2)、

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

AutoCompleteTextViewDemoActivity 类:
package com.example.basiccomponent2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.AutoCompleteTextView;

import com.example.adapter.ACTVArrayAdapter;

public class AutoCompleteTextViewDemoActivity extends Activity {
    private AutoCompleteTextView actv_showinfo = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.autocompletetextview_layout);
        //获得AutoCompleteTextView组件id
        actv_showinfo = (AutoCompleteTextView) super.findViewById(R.id.actv_showinfo);
        //得到数组数据
        String str[] = getResources().getStringArray(R.array.s_stuname);
        /*实例化自定义Adapter,
         * Context context:第一个参数表示上下文
         * int resource:表示新建的autocompletetextview_extra_layout.xml文件
         * int textviewResourceId:表示新建的autocompletetextview_extra_layout.xml文件中的TextView组件id
         * Object objects[]:表示要传入的数组数据
         */
        ACTVArrayAdapter adapter = new ACTVArrayAdapter(AutoCompleteTextViewDemoActivity.this,
                R.layout.autocompletetextview_extra_layout,R.id.tv_showactvitem,str);
        //设置AutoCompleteTextView组件的id的适配器
        actv_showinfo.setAdapter(adapter);
    }
}

3)、新建一个Adapter类。
package com.example.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.example.basiccomponent2.R;

public class ACTVArrayAdapter extends ArrayAdapter {
    private Context context;//表示上下文,即要传过来的Activity类
    private int resource;    //表示资源文件,即要传入的新建的xml文件
    private int textViewResourceId;//表示资源文件中的组件id,即要传入的新建的xml文件中组件的id
    private Object str[];            //表示要传过来的数组,
    private LayoutInflater inflater;//表示要把xml中的数据要加载到AutoCompleteTextView中借助的类。

    public ACTVArrayAdapter(Context context, int resource,
            int textViewResourceId, Object[] objects) {
        super(context, resource, textViewResourceId, objects);
        this.context = context;
        this.resource = resource;
        this.textViewResourceId=textViewResourceId;
        this.str = objects;
        inflater = LayoutInflater.from(context);//实例化LayoutInflater
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            // 把指定的布局文件转换成view
            convertView = inflater.inflate(resource, null);
        }
        //传过来的资源文件中的组件id,通过TextView来接收
        TextView tv_item = (TextView) convertView.findViewById(textViewResourceId);
        int p = position%str.length;//防止数组越界
        //把数组中的数据设置到autocompletetextview_extra_layout.xml中的TextView中,
        //然后再加载到AutoCompleteTextView组件中
        tv_item.setText(""+str[p]);
        return super.getView(position, convertView, parent);
    }
}

4)、运行效果:


1.3、

1)、

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView 
        android:id="@+id/iv_shouwactvitemimage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView 
        android:id="@+id/tv_showactvitem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

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

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

完整代码:

package com.example.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.basiccomponent2.R;

public class ACTVArrayAdapter extends ArrayAdapter {
    private Context context;//表示上下文,即要传过来的Activity类
    private int resource;    //表示资源文件,即要传入的新建的xml文件
    private int textViewResourceId;//表示资源文件中的组件id,即要传入的新建的xml文件中组件的id
    private Object str[];            //表示要传过来的数组,
    private LayoutInflater inflater;//表示要把xml中的数据要加载到AutoCompleteTextView中借助的类。
    //定义一个图片id数组用于保存图片id
    int icon[] = {
            R.drawable.d1,
            R.drawable.d2,
            R.drawable.d3
    };
    public ACTVArrayAdapter(Context context, int resource,
            int textViewResourceId, Object[] objects) {
        super(context, resource, textViewResourceId, objects);
        this.context = context;
        this.resource = resource;
        this.textViewResourceId=textViewResourceId;
        this.str = objects;
        inflater = LayoutInflater.from(context);//实例化LayoutInflater
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            // 把指定的布局文件转换成view
            convertView = inflater.inflate(resource, null);
        }
        //传过来的资源文件中的组件id,通过TextView来接收
        TextView tv_item = (TextView) convertView.findViewById(textViewResourceId);
        int p = position%str.length;//防止数组越界
        //把数组中的数据设置到autocompletetextview_extra_layout.xml中的TextView中,
        //然后再加载到AutoCompleteTextView组件中
        tv_item.setText(""+str[p]);
        //获得autocompletetextview_extra_layout.xml中的ImageView组件id
        ImageView iv_item =(ImageView)convertView.findViewById(R.id.iv_shouwactvitemimage);
        //防止数组越界
        int i = position%icon.length;
        //把图片加载到ImageView中
        iv_item.setImageResource(icon[i]);
        return super.getView(position, convertView, parent);
    }
}

3)、运行效果:



2、Spinner的使用:

2.1、


1)、

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout      -->定义线性布局管理器
    xmlns:android="http://schemas.android.com/apk/res/android"     -->引入命名空间
    android:layout_width="match_parent"                            -->设置布局管理器宽度为屏幕宽度
    android:layout_height="match_parent"                           -->设置布局管理器高度为屏幕高度
    android:orientation="vertical" >                               -->设置布局管理器中的内容为垂直显示
    <!-- Spinner组件 -->
    <Spinner         -->定义Spinner控件
        android:id="@+id/s_stu_name"             -->设置组件id
        android:layout_width="match_parent"      -->设置组件宽度为父容器宽度
        android:layout_height="wrap_content"     -->设置组件高度为包裹内容高度
        android:entries="@array/s_stuname"/>     -->设置Spinner下拉列表内容,表示从arrays.xml中读取,
</LinearLayout>
2)、 定义一个资源文件arrays.xml,该文件中保存一些数组信息,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="s_stuname">   -->定义数组,标签名必须为string-array
        <item>张三</item>
        <item>李四</item>
        <item>王五</item>
        <item>赵六</item>
    </string-array>
</resources>

3)、 定义SpinnerDemoActivity类并设置布局管理器,代码如下:
package com.example.basiccomponent2;

import android.app.Activity;
import android.os.Bundle;

public class SpinnerDemoActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.spinner_layout);//设置布局管理器
    }
}

4)、运行效果:



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

1)、去掉此属性
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- Spinner组件 -->
    <Spinner
        android:id="@+id/s_stu_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

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

3)、 新建一个类SpinnerDemoAdapter继承BaseAdapter,此时需要覆写一下方法:
@Override
    public int getCount() {//表示获得总列表项数
        return 0;
    }

    @Override
    public Object getItem(int arg0) {//获得列表项
        return null;
    }

    @Override
    public long getItemId(int arg0) {//获得列表项id
        return 0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {//获得view
        return null;
    }

覆写之后的方法,完整代码:
package com.example.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SpinnerDemoAdapter<T> extends BaseAdapter {
    //定义上下文参数,用于接受传过来的Activity类
    private Context context;
    //定义资源文件id,用于接收传过来的布局文件
    private int resource;
    //定义数组,用于接收传过来的数组数据
    private String str[];
    //重载构造方法
    public SpinnerDemoAdapter(Context context,int resource,String str[]){
        this.context = context;
        this.resource = resource;
        this.str = str;
    }
    @Override
    public int getCount() {//表示获得总列表项数
        //如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空
        if(str!=null){
            return str.length;
        }
        return 0;
    }

    @Override
    public Object getItem(int arg0) {//获得列表项
        return null;
    }

    @Override
    public long getItemId(int arg0) {//获得列表项id
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {//获得view
        //把传过来的Activity类,加载到TextView中
        TextView tv_item = new TextView(context);
        //把数组中的的数据加载到TextView中
        tv_item.setText(str[position]);
        return tv_item;
    }

}
4)、 Spinner子列表的内容为TextView,为此新建一个spinner_extra_layout.xml文件,在文件中只建立一个组件TextView。代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/tv_showspinneritem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

5)、 接下来在SpinnerDemoAdapter类中声明三个属性,用于接收构造函数传过来的参数。构造函数初始化这三个属性。
//定义上下文参数,用于接受传过来的Activity类
    private Context context;
    //定义资源文件id,用于接收传过来的布局文件
    private int resource;
    //定义数组,用于接收传过来的数组数据
    private String str[];

6)、 SpinnerDemoActivity类完整代码如下
package com.example.basiccomponent2;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Spinner;

import com.example.adapter.SpinnerDemoAdapter;

public class SpinnerDemoActivity extends Activity {
    private Spinner s_stu_name = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.spinner_layout);// 设置布局管理器
        // 获得组件id
        s_stu_name = (Spinner) super.findViewById(R.id.s_stu_name);
        // 获得资源文件中的数组
        String str[] = this.getResources().getStringArray(R.array.s_stuname);
        /*
         *  通过SpinnerDemoAdapter类完成数据加载:
         *  1、Context context:表示Activity上下文
         *  2、int textViewResourceId:表示布局文件中的组件id
         *  3、T[] objects:表示数组类型数据
         */
        SpinnerDemoAdapter<String> adapter = new SpinnerDemoAdapter<String>(SpinnerDemoActivity.this,R.id.tv_showspinneritem, str);
        //为组件加载ArrayAdapter
        s_stu_name.setAdapter(adapter);
    }
}

7)、运行效果:


2.3、

1)、
spinner_extra_layout.xml里面只有一个TextView组件,所以可以通过TextView tv_item = new TextView(context)实例化一个TextView,接下来换成convertView.findViewById完成,修改SpinnerDemoAdapter类。
package com.example.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.basiccomponent2.R;

public class SpinnerDemoAdapter<T> extends BaseAdapter {
    //定义上下文参数
    private Context context;
    //定义资源文件组件id
    private int resource;
    //定义数组
    private String str[];
    //定义
    private LayoutInflater inflater;
    //重载构造方法
    public SpinnerDemoAdapter(Context context,int resource,String str[]){
        this.context = context;
        this.resource = resource;
        this.str = str;
        inflater = LayoutInflater.from(context);//初始化LayoutInflater
    }
    @Override
    public int getCount() {//表示获得总列表项数
        //如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空
        if(str!=null){
            return str.length;
        }
        return 0;
    }

    @Override
    public Object getItem(int arg0) {//获得列表项
        return null;
    }

    @Override
    public long getItemId(int arg0) {//获得列表项id
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {//获得view
        if(convertView==null){
            convertView=inflater.inflate(resource, null);
        }
        
        //TextView tv_item = new TextView(context);
        TextView tv_item = (TextView) convertView.findViewById(R.id.tv_showspinneritem);
        int p = position%str.length;

        tv_item.setText(str[p]);
        return convertView;
    }

}

2)、运行效果跟之前一样:

 
   

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

1)、
package com.example.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.basiccomponent2.R;

public class SpinnerDemoAdapter<T> extends BaseAdapter {
    // 定义上下文参数
    private Context context;
    // 定义资源文件组件id
    private int resource;
    // 定义数组
    private String str[];
    // 定义
    private LayoutInflater inflater;
    // 定义图片id数组
    int icon[] = {
            R.drawable.d1,
            R.drawable.d2,
            R.drawable.d3 
    };

    // 重载构造方法
    public SpinnerDemoAdapter(Context context, int resource, String str[]) {
        this.context = context;
        this.resource = resource;
        this.str = str;
        inflater = LayoutInflater.from(context);// 初始化LayoutInflater
    }

    @Override
    public int getCount() {// 表示获得总列表项数
        // 如果传过来的数组不为空,则返回列表数(下拉列表显示条数)为数组长度,否则放回空
        if (str != null) {
            return str.length;
        }
        return 0;
    }

    @Override
    public Object getItem(int arg0) {// 获得列表项
        return null;
    }

    @Override
    public long getItemId(int arg0) {// 获得列表项id
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {// 获得view
        if (convertView == null) {
            convertView = inflater.inflate(resource, null);
        }
        int i = position % icon.length;// 防止加入的图片越界
        int t = position % str.length;
        // 获得spinner_extra_layout.xml中TextView的id
        TextView tv_item = (TextView) convertView.findViewById(R.id.tv_showspinneritem);
        // 获得spinner_extra_layout.xml中ImageView的id
        ImageView iv_item = (ImageView) convertView.findViewById(R.id.iv_showspinnerimage);
        iv_item.setImageResource(icon[i]);// 把每一个图片设置到Spinner下拉列表中
        tv_item.setText(str[t]); // 把每一个文本设置到Spinner下拉列表中
        return convertView;
    }

}

2)、运行效果:

 
  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值