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(';'));
}