Android第九天Spinner、ArrayAdapter、SimpleAdapter、AutoCompleteTextView

一. AdapterView(适配器视图,实际上就是一系列 列表类UI组件)
①.AdapterView即Adapter控件,其内容通常是一个包含多项相同格式资源的列表,每次只显示其中的一项。
②. 常用的AdapterView:

包括:ListVew(列表)、Spinner(下拉列表)、GridView(网格图)

适配器:从数据源到UI组件(特指适配器视图AdapterView)的中介.负责把数据源填充到UI组件中,以便显示给用户.

先把多条数据放入一个列表(中介),然后将这个列表加载到Adapter控件(AdapterView)中。
这个存放Adapter控件的内容的列表,在Android被称为Adapter(适配器)。
几种常用的Adapter:
1.ArrayAdapter:数组适配器. 是最简单的Adapter,适用于 列表项中只含有一条文本信息的情况;
2.SimpleAdapter:比ArrayAdapter复杂,每一个列表项中可以含有不同的子控件;
3.SimpleCursorAdapter:把从数据库查出的数据适配给AdapterView;
4.自定义Adapter:完全自行定义数据的适配方式,灵活性最强,也最常用;
5.其他的Adapter 采用MVC模式将前端显示V和后端数据M分离.

MVC:Model  数据模型

  Control 控制器

View 视图

采用MVC模式将前端显示V和后端数据M分离.为AdapterView提供数据的List或数组等 数据源 相当于MVC模式中的M(数据模型Model)。Adapter对象相当于MVC模式中的C(控制器Controler)。MVC结构就是用C将M填充到V中去.


Spinner:下拉列表视图

父类:AbsSpinner->AdapterView

代码:

    android:id="@+id/spinner"
   
android:layout_width="wrap_content"
   
android:layout_height="wrap_content"
   
android:entries="@array/province"
   
android:spinnerMode="dropdown">

android:entries 表示 : 下拉列表数据源集合   。该集合必须在res/values/strings.xml文件中定义:

name="province">
    北京
    山西
    山东
    河北
    湖南
    湖北
    辽宁
    黑龙江
    江苏

android:spinnerMode表示:两种展示模式

dropdown:

Android第九天Spinner、ArrayAdapter、SimpleAdapter、AutoCompleteTextView_第1张图片

dialog:

Android第九天Spinner、ArrayAdapter、SimpleAdapter、AutoCompleteTextView_第2张图片

在Java代码中添加数据源:

列表视图 Spinner 的数据源是数组或者集合: 定义 数组或者List集合都可以

适配器:

ArrayAdapter:数组适配器

  1. 共有6种构造方法
  2. 父类 BaseAdapter
  3. 数据源只能是文本集合
  4. item条目布局只能是TextView
三个参数的构造方法:
  •  参数一:上下文对象
  • 参数二:条目布局id ,此时使用的是系统提供的布局Id, 该布局中只能含有一个TextView
  • 参数三:数据源 List list

ArrayAdapter<String>adapter= new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item,list);

两个参数的构造方法:
  •  参数一:上下文对象
  •   参数二:条目布局id ,此时使用的是系统提供的布局Id, 该布局中只能含有一个TextView

ArrayAdapter<String>adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item);

当用了两个参数的构造方法的时候由于Adapter没有数据源,所以需要调用:

adapter.addAll(list); // 添加数据源

使用适配列表视图设置适配器:

spinner.setAdapter(adapter);


ArrayAdapter的方法:
 添加数据:1.添加单个对象数据

adapter.add("呼伦贝尔大草原");

   2.添加String集合

 adapter.addAll(list);

 移除数据:

       adapter.remove("乌兰察布");

 刷新数据:当数据源发生改变后必须调用刷新方法来刷新适配器,否则视图将不会修改

adapter.notifyDataSetChanged();

 设置自定义条目: 参数二是自定义的布局 ,但是 当使用ArrayAdapter 的时候要求布局中只能包含一个TextView

adapter = new ArrayAdapter<String>(this,R.layout.item_layout,list)

 item_layout布局代码:

xml version="1.0"encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
   
android:textSize="20sp"
   
android:padding="10dp"
   
android:textColor="@color/colorAccent"
   
android:layout_width="match_parent"
   
android:layout_height="match_parent">


Spinner的监听器: OnItemSelectedListener

 spinner.setOnItemSelectedListener(newAdapterView.OnItemSelectedListener() {
           
@Override
           
public void onItemSelected(AdapterView parent,View view,int position,long id) {
               
/*当选择的时候执行该方法
                *记住参数三:position  位置  表示的是你选中的 条目的位置
                * 根据position来 获取应该展示的数据
                */
                city = list.get(position);
               Toast.makeText(MainActivity.this, city, Toast.LENGTH_SHORT).show();
            }
           
@Override
           
public void onNothingSelected(AdapterView parent) {
               
//什么都没选    一般该方法不会执行
            }
        })
;


SimpleAdapter:简单适配器
  如果想让Spinner,ListView等组件中每一条显示的数据类型和个数不只一个,就需要用SimpleAdapter适配器来适配数据了.
 SimpleAdapter 的数据源必须是 List> list ; 必须自定义条目布局
 模拟初始化数据源:

List<Map<String,Object>>list = new ArrayList<>();
for (int i= 0; i < 20; i++) {
    Map<String,Object>map = new HashMap<>();
   
map.put("name","张三");
   
map.put("age","18");
   
map.put("pic",R.mipmap.ic_launcher);
   
map.put("isSingle",true);

list.add(map);

}


 模拟item条目布局:

xml version="1.0"encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
   
android:orientation="horizontal"android:layout_width="match_parent"
   
android:layout_height="match_parent">

           
android:layout_width="wrap_content"
       
android:textSize="20sp"
       
android:id="@+id/name_tv"
       
android:layout_margin="10dp"
       
android:layout_height="wrap_content"/>
           
android:layout_width="wrap_content"
       
android:textSize="20sp"
       
android:id="@+id/age_tv"
       
android:layout_margin="10dp"
       
android:layout_height="wrap_content"/>
           
android:layout_width="wrap_content"
       
android:layout_margin="10dp"
       
android:id="@+id/pic_iv"
       
android:layout_height="wrap_content"/>
           
android:layout_width="wrap_content"
       
android:textSize="20sp"
       
android:layout_margin="10dp"
       
android:id="@+id/isSingle_cb"
       
android:layout_height="wrap_content"/>

 SimpleAdapter的构造方法 5个参数:
  1. 参数一:上下文对象
  2. 参数二:数据源
  3. 参数三:item布局条目的id
  4. 参数四:数据源Map中key的集合数组
  5. 参数五:item布局中 所有视图id 的集合数组 ,与参数四一一对应

//数据源中Map中key 提取出来组成的集合

String[]keys = {"name","age","pic","isSingle"};

//条目布局中的id 的集合 用于展示上面的 key 对应的value

int[]ids = {R.id.name_tv,R.id.age_tv,R.id.pic_iv,R.id.isSingle_cb};

//适配器
 SimpleAdapter adapter=new SimpleAdapter(this,list,R.layout.simple_item_layout,keys,ids);

spinner.setAdapter(adapter);


 展示效果: Android第九天Spinner、ArrayAdapter、SimpleAdapter、AutoCompleteTextView_第3张图片



AutoCompleteTextView:自动提示完成文本框
父类: EditText
属性:
android:completionHint 设置出现在下拉提示列表 底部的提示信息
android:completionThreshold ['θreʃ,həʊld]入口;门槛;自动完成的 字数门槛, 即用户至少输入多少个字符才会显示提示 
android:dropDownHorizontalOffset 设置下拉菜单于文本框之间的水平偏移。下拉菜单默认与文本框 左对齐 
android:dropDownVerticalOffset 设置下拉菜单于文本框之间的垂直偏移。下拉菜单默认紧跟文本框 
android:dropDownHeight 设置下拉菜单的高度 
android:dropDownWidth 设置下拉菜单的宽度 
代码:

    android:layout_width="match_parent"
   
android:completionThreshold="1"
   
android:completionHint="请选择"
   
android:layout_height="wrap_content"/>


使用:和Spinner一样的使用方法 配合ArrayAdapter适配器:

AutoCompleteTextView autoTv = (AutoCompleteTextView) findViewById(R.id.autoTv);
//设置适配器
autoTv.setAdapter(adapter);

效果:当输入了数据后会根据数据源进行提示
Android第九天Spinner、ArrayAdapter、SimpleAdapter、AutoCompleteTextView_第4张图片





你可能感兴趣的:(Android课程)