一、Spinner
概念;下拉菜单控件 默认显示当前选择的项(第一次展示集合中第一条数据)
属性:
android:entries="@array/books" 展示数据 (note:提前知道数据是什么 )
android:spinnerMode="dropdown" spinner 样式
dropdown:下拉列表 设置popupBackground 每一项的背景颜色
dialog:弹出框 设置prompt 标题 调用的是Values/string.xml/string
监听:setOnItemSelectedListener
例题:
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity {
private Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) findViewById(R.id.spinner);
//给spinner设置监听 OnItemSelectedListener
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
/**
* 那个条目被选中
* AdapterView<?> parent:监听器下拉列表对象
* View view: 当前被选中的view
*int position: 被选中的条目的
*long id; 被选中的条目的id
*
*/
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
//获取资源里的字符串数组
String[] books = getResources().getStringArray(R.array.books);
String info= books[position];
Toast.makeText(MainActivity.this, "您选择的是:"+info, Toast.LENGTH_SHORT).show();
}
/**
* 数据被清除时调用:(一般不使用)
*/
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
二、什么是Adapter?
适配器 将数据转换成控件识别的形式
子类:BaseAdapter ArrayAdapter SimpleAdapter
ArrayAdapter的使用?
一般用于只有String类型数据 展示到TextView上
如果三个参数的ArrayAdapter item布局的根节点 必须是TextView
如果跟节点不是TextVIew 三个参数的会报错 使用四个参数的ArrayAdapter
例题:
public class MainActivity extends Activity {
private Spinner spinner;
private String[] data;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1,得到控件
spinner = (Spinner) findViewById(R.id.spinner);
//2,获取数据源
data = new String[]{"java","C","Html","C++"};
//3,获取Adapter对象
/**
* 参数1:上下文
* 参数2:每个item 的布局
* 参数3:数据源
*/
adapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_spinner_item, data);
//4,将数据展示到 控件上
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 方式1;
String info1 = data[position];
//方式2
String info2 = parent.getItemAtPosition(position).toString();
//方式3
String info3 = spinner.getItemAtPosition(position).toString();
//方式4
String info4 = adapter.getItem(position);
Toast.makeText(MainActivity.this, "info1:"+info1+"=info2:"+info2+"=info3:"+info3+"=info4:"+info4, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
SimpleAdapter的使用:
处理复杂的数据 (带有图片和文字)
Context context: 上下文
List<? extends Map<String, ?>> data: 数据源
int resource: 布局
String[] from: 数据源中带key的数组
int[] to : 布局资源中id的数组
【注】:from里的key和to里的控件id 是对应关系
例题:
public class MainActivity extends Activity {
private Spinner spinner;
private SimpleAdapter adapter;
//数据源
private List<Map<String, Object>> data;
private int[] icons = {R.drawable.img_11,R.drawable.img_12,R.drawable.img_13,
R.drawable.img_14,R.drawable.img_15,R.drawable.img_16};
private String[] citys= {"北京","上海","广州","深圳","台湾","澳门"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1,找出控件
spinner = (Spinner) findViewById(R.id.spinner);
//2数据源 ???
//实例化
data = new ArrayList<Map<String,Object>>();
for(int i=0;i<icons.length;i++){
Map<String,Object> map = new HashMap<String, Object>();
map.put("icon", icons[i]);
map.put("city", citys[i]);
data.add(map);
}
/**
* Context context: 上下文
* List<? extends Map<String, ?>> data: 数据源
int resource: 布局
String[] from: 数据源中带key的数组
int[] to : 布局资源中id的数组
note:from里的key和to里的控件id 是对应关系
*/
adapter = new SimpleAdapter(MainActivity.this, data,
R.layout.item, new String[]{"icon","city"}, new int[]{R.id.iv,R.id.tv});
//3,将数据展示到控件上
spinner.setAdapter(adapter);
}
}
三、AutoCompleteTextView
自动索引的EditText(文本输入框)
默认输入俩个字符 才开始索引
android:completionThreshold="1" 输入几个字符开始索引
例题:
public class MainActivity extends Activity {
private AutoCompleteTextView autoView;
private String[] data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1,找到控件
autoView = (AutoCompleteTextView) findViewById(R.id.autoView);
//2,获取数据源
data = new String[]{"a","android","apple","c","c++","c#"};
//获取adapter对象 目的将数据展示到对应的item上
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_spinner_item, data);
//3,将数据展示到控件上
autoView.setAdapter(adapter);
//item的点击监听
/**
* 参数1:用户点击控件AutoCompleteTextView
* 参数2:用户点击的item
* 参数3:用户所点击item的位置
* 参数4:用户点击item的id
*
*/
autoView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "===>"+data[position], Toast.LENGTH_SHORT).show();
}
});
//文本发生变化的监听 可以对EditText操作
autoView.addTextChangedListener(new TextWatcher() {
/**
* 改变文本时调用
* CharSequence s:变化之后的文本
* int start:变化的起点 从哪里开始改变
* int before: 相比较文本变化 添加没有改变0 删除改变
* int count:相比较文本变化 添加有值 删除没有改变0
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
Log.e("AAA", "==onTextChanged==s:"+s+"=start:"+start+"=before:"+before+"=count:"+count);
}
/**
* 改变文本之前调用
* CharSequence s:变化之前的文本
* int start:变化之前的文本下标
* int count:相比较文本的变化 添加不变的0 删除是改变:删除几个展示结果
* int after:相比较文本的变化 如果添加是有值 如果删除不变 0
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
Log.e("AAA", "==beforeTextChanged==s:"+s+"=start:"+start+"=count:"+count+"=after:"+after);
}
/**
* 改变文本之后调用
* Editable s:改变之后的文本
*/
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
Log.e("AAA", "==afterTextChanged==s:"+s);
}
});
}
}