高级控件01 自动补全与下拉列表

1. 高级控件与低级控件区别

是否使用适配器

2. 适配器种类和作用

2.1 种类
数组适配器 ArrayAdapter
new ArrayAdapter(this,R.layout.actv_style, names);

  简单适配器 SimpleAdapter(图和下拉框)
    也叫“并不简单的简单适配器”^_^

  自定义适配器

2.2 作用
桥梁
展示(适配器本身没有展示功能,他是通过解析某一个资源文件来展示的)
创建项资源是为了高级控件展示数据用的(在layout里创建LayOut Resource,命名(act_main_item1))
高级控件展示数据都是通过基本控件弄得
想要什么效果,改变项资源即可

3. 高级控件使用步骤

3.1 获取数据
3.2 创建适配器
3.3 绑定适配器

4. 自动提示文本框

4.1 AutoCompleteTextView(单一提示)
android:completionThreshold=”1”

自动补全

 <AutoCompleteTextView
        android:id="@+id/act_main_act1"
        android:layout_width="match_parent"
        android:layout_height="60dp" />

//在layoout创建act_main_act1
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"

    android:textColor="@color/red"
    android:layout_height="match_parent">
</TextView>


//在MainActivity.java里
    private String[] data1;
    private ArrayAdapter<String> adapter1;
    private AutoCompleteTextView act_main_act1;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        act_main_act1=findViewById(R.id.act_main_act1);
        sp_main_sp1=findViewById(R.id.sp_main_sp1);
        sp_main_sp2=findViewById(R.id.sp_main_sp2);
        //获取数据 httpclient
        data1 = new String[]{ "愤怒的小鸟", "汤姆猫", "落汤鸡", "牛牛", "哈巴狗", "神龙", "烤鸭","小象", "美人鱼", "九尾狐"};
        //创建适配器(适配器初始化要通过当前的上下文以及去把项资源文件解析成一个视图,把数据绑定到data1里面)
        adapter1=new ArrayAdapter<String>(this,R.layout.act_main_item1,data1);
        //绑定适配器
        act_main_act1.setAdapter(adapter1);

4.2 MultiAutoCompleteTextView(多次提示)–作业
//设置多次提示时,设置分隔符方法
Tokenizer t = new MultiAutoCompleteTextView.CommaTokenizer();
mactv_main.setTokenizer(t);//默认,分割

4.3 两种自动提示文本框的异同
AutoCompleteTextView:支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据
MultiAutoCompleteTextView: 可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个值选中的时候再次输入值时会自动去匹配。
可用在发短信,发邮件时选择联系人这种类型当中。

5. 下拉框

Spinner

下拉框选中事件监听
AdapterView.OnItemSelectedListener

<Spinner
        android:id="@+id/sp_main_sp1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></Spinner>

//①创建类(Book,BookDao,Option)
//②在layout里创建sp_main_item1
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="60dp">
    <TextView
        android:id="@+id/tv_main_item_tv1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

//在MainActivity.java里
private List<Option> data2;
private ArrayAdapter<Option> adapter2;
private Spinner sp_main_sp1;

 data2=LoadData2();//为了获取数据
 adapter2=new ArrayAdapter<Option>(this,R.layout.act_main_item1,data2);
 sp_main_sp1.setAdapter(adapter2);
 sp_main_sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
          public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
              Option selectedItem = (Option) adapterView.getSelectedItem();
              Toast.makeText(MainActivity.this,selectedItem.getHtml(),Toast.LENGTH_SHORT).show();

          }

          @Override
          public void onNothingSelected(AdapterView<?> parent) {

          }
      });
 //建Option类是达到共用的效果
    private List<Option> LoadData2() {
        List<Book> list = new BookDAO().list();
        List<Option> optionList=new ArrayList<>();
        for (Book book :list) {
            optionList.add(new Option(book.getId()+"",book.getName()));
        }
        return optionList;
    }

下拉框显示图片与数据

<Spinner
        android:id="@+id/sp_main_sp2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></Spinner>

//①创建类(Book,BookDao,Option)
//②在layout里创建sp_main_item1
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="60dp">

    <ImageView
        android:id="@+id/iv_main_item_iv1"
        android:layout_width="60dp"
        android:layout_height="match_parent" />
    <TextView
        android:id="@+id/tv_main_item_tv1"
        android:layout_width="match_parent"

//在MainActivity.java里
    private List<Map<String,Object>> data3;
    private SimpleAdapter adapter3;
    private Spinner sp_main_sp2;

 data3=loadDate3();
//new String[]{"name","image"}与new int[]{R.id.tv_main_item_tv1,R.id.iv_main_item_iv1}要相互对应
 adapter3=new SimpleAdapter(this,data3,R.layout.sp_main_item2,new String[]{"name","image"},new int[]{R.id.tv_main_item_tv1,R.id.iv_main_item_iv1});
 sp_main_sp2.setAdapter(adapter3);

  private List<Map<String,Object>> loadDate3() {
        List<Book> list = new BookDAO().list();
        List<Map<String,Object>> mapList=new ArrayList<>();
        Map<String,Object> map=null;
        for (Book book:list) {
            map=new HashMap<>();
            map.put("name",book.getName());
            map.put("image",book.getImage());
            mapList.add(map);
        }
        return mapList;
    }

核心:

1、数组适配器
    String[]    AutoCompleteTextView        项资源
    List<Dept>  Spinner 项资源
2、获取下拉框的值
3、简单适配器
    List<Map>   项资源

例题
1. android开发中为MultiAutoCompleteTextView控件添加其他分隔符,例如:分隔符改为分号“;”
zs;ls;ww;xm

//创建SemicoloTokenizer类
package com.example.a0912_work;

import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.MultiAutoCompleteTextView.Tokenizer;

/**
 *
 * 通用类(为MultiAutoCompleteTextView控件添加其他分隔符)
 */

public class SemicolonTokenizer implements Tokenizer {
    private char chars;
    private String mString;

    public SemicolonTokenizer(char chars) {
        this.chars = chars;
        mString = String.valueOf(chars);
    }

    public int findTokenStart(CharSequence text,int cursor){
        int i = cursor;

        while(i>0&&text.charAt(i-1)!=chars){
            i--;
        }
        while (i<cursor&&text.charAt(i)==' '){
            i++;
        }
        return i;
    }
   public int findTokenEnd(CharSequence text,int cursor){
        int i =cursor;
        int len = text.length();
        while (i<len){
            if (text.charAt(i)==chars){
                return i;
            }else{
                i++;
            }
        }
        return len;
   }

   public CharSequence terminateToken(CharSequence text){
        int i =text.length();
        while (i>0&&text.charAt(i-1)==' '){
            i--;
        }
        if (i>0&&text.charAt(i-1)==chars){
            return text;
        }else {
            if (text instanceof Spanned){
                SpannableString sp = new SpannableString(text+mString);

                TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0);
                return sp;
            }else{
                return text+mString;
            }
        }
   }
      //设置多次提示时,设置分隔符方法
      mact_main_mact1.setTokenizer(new SemicolonTokenizer(';'));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值