本文围绕以下三个部分展开:
一、适配器视图与适配器(AdapterView & Adapter)
二、四个案例
1. 静态Spinner
2. 动态Spinner
3. 列表框 单选
4. 列表框 多选
附 代码补充
一、适配器视图与适配器(AdapterView & Adapter)
1. 适配器视图:
它继承自视图组(一个包含其他子视图的容器),是需要适配器的视图容器。
常用的适配器视图有:Spinner(单行下拉列表框)、ListView(多行下拉列表框)、GridView、Gallery、ViewPager。
2. 适配器:
它在视图与数据之间扮演了一个桥梁的作用,将数据中的每一项数据转化为适配器视图可以使用的每一个视图项。
3. Spinner:
包括静态Spinner和动态Spinner。
Spinner有两种定义方式:
(1)使用静态资源。
使用资源文件中的字符串数组,数据是固定的;这是最常用、最简单的方式。
(2)使用适配器。
使用数组适配器(ArrayAdapter),数据长度可变。
二、四个案例
1. 静态Spinner
说明:
“专业技能”后面的单行下拉列表框,默认有4个值,单击哪个,正文中就会显示哪个。
private Spinner spinner; private TextView tvContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_static_spinner); // 获取字符串数组 // 要传到内部类中,值必须不能改变,因此要用 final 修饰 final String[] skills = this.getResources().getStringArray(R.array.skills); spinner = (Spinner) findViewById(R.id.spinner); tvContent = (TextView) findViewById(R.id.tvContent); // 注册spinner选中item的事件 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { tvContent.setText(skills[position]); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); }
2. 动态Spinner
说明:
在文本框中输入技能,点击“新增选项”,该技能就会新增到上面的单行下拉列表框中。
在文本框中不输入内容,点击“新增选项”时,会弹出“请输入技能.”的提示。
当点击“删除选中项”将单行下拉列表框中的技能全部删除后,再点击“删除选中项”,会弹出“无选中项.”的提示。
private EditText txtSkill; private Spinner spinner; //适配器:关联数据与控件 (桥梁作用) private ArrayAdapter<String> adapter; //动态数据 (可来自数据库/网络) private List<String> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamic_spinner); txtSkill = (EditText) findViewById(R.id.txtSkill); // 参数一:上下文(Content) // 参数二:系统中的布局资源 android.R.layout.simple_spinner_dropdown_item // 参数三:数据,可以是字符串资源【长度不可变】,也可以是 ArrayList【长度可变】 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, getData()); spinner = (Spinner) findViewById(R.id.spinner); //控件与适配器关联 spinner.setAdapter(adapter); } private List<String> getData() { // 动态数据 (可来源于数据库/网络) data = new ArrayList<String>(); data.add("Java"); data.add("C"); data.add("Swift"); data.add("C++"); return data; } public void onClick(View view) { switch (view.getId()) { case R.id.btnAdd: add(); break; case R.id.btnRemove: remove(); break; } } private void remove() { // 获取当前选项的下标(索引) int position = spinner.getSelectedItemPosition(); if (position == -1) { Toast.makeText(this, "无选中项.", Toast.LENGTH_SHORT).show(); } else { // 删除指定下标的选项 data.remove(position); // 适配器通知【视图】数据集已改变,视图会重绘。 adapter.notifyDataSetChanged(); } } private void add() { String skill = txtSkill.getText().toString(); if (skill == null || skill.trim().length() == 0) { Toast.makeText(this, "请输入技能.", Toast.LENGTH_SHORT).show(); } else { txtSkill.setText(""); //在数据中添加新内容 data.add(skill); //获得列表的适配器中数据项的总数 int size = spinner.getAdapter().getCount(); // size = data.size(); //设置选中项的位置 spinner.setSelection(size - 1); // 适配器通知【视图】数据集已改变,视图会重绘。 adapter.notifyDataSetChanged(); } }
3. 列表框 单选
说明:
界面中从“Item 1”一直到“Item 30”。
当点击其中一项,比如“Item 6”的时候,会弹出“点击了Item 6”的提示。
private ListView listView; private ArrayList<String> data; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view_acitivity); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData()); listView = (ListView) findViewById(R.id.listView); // 设置选中模式 为 单选 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setAdapter(adapter); // 列表框 点击选项 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, longid) { String dataItem = data.get(position); Toast.makeText(getApplicationContext(), getString(R.string.click) + dataItem, Toast.LENGTH_SHORT).show(); } }); } private ArrayList<String> getData() { data = new ArrayList<String>(); for (int i = 0; i < 30; i++) { data.add("Item " + i); } return data; }
4. 列表框 多选
说明:
选中其中的几项后,点击“选中的项”,会弹出提示。
//数据的标签(KEY) private static final String KEY_NAME = "name"; private static final String KEY_PHONE = "phone"; //视图 private ListView listView; //数据:由键值对构成的列表【供简单适配器使用】 private ArrayList<HashMap<String, Object>> data; //适配器:简单适配器 (一行可以显示多个控件) private SimpleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_multiple_list_view); //数据的 KEY 构成的数组 String[] from = {KEY_NAME, KEY_PHONE}; // 控件的 ID 构成的数组 int[] to = {android.R.id.text1, android.R.id.text2}; // 参数一:上下文 // 参数二:数据 // 参数三:系统布局模版【activated 代表可高亮显示,2 代表有两个控件】 // simple_list_item_activated_2 // simple_list_item_multiple_choice (CheckBox) // simple_list_item_single_choice (RadioButton) // 参数四:数据的 KEY 构成的数组 // 参数五:控件的 ID 构成的数组 adapter = new SimpleAdapter( getApplicationContext(), getData(), android.R.layout.simple_list_item_activated_2, from, to); listView = (ListView) findViewById(R.id.listView); // 设置为多选模式 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // 设置适配器 listView.setAdapter(adapter); } /** * 初始化数据 * * @return */ private ArrayList<HashMap<String, Object>> getData() { // ArrayList 表示一行的数据 // HashMap 表示一行中的多个数据 data = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < 30; i++) { HashMap<String, Object> item = new HashMap<String, Object>(); item.put(KEY_NAME, getString(R.string.name) + i); item.put(KEY_PHONE, getString(R.string.phone) + i); data.add(item); } return data; } public void onClick(View view) { // 获得选中项的总数 int count = listView.getCheckedItemCount(); // 获得选中项的标识【使用SQLite及游标时可用】 long[] ids = listView.getCheckedItemIds(); // 获得选中的位置【单选】 int position = listView.getCheckedItemPosition(); // 获得选中的位置【多选,获得一个稀疏矩阵】 SparseBooleanArray array = listView.getCheckedItemPositions(); // 显示结果 Toast.makeText(this, array.toString(), Toast.LENGTH_SHORT).show(); }
附 代码补充
1. 设置标题栏等颜色: styles.xml(v21)
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppTheme" parent="android:Theme.Material.Light"> <item name="android:colorPrimaryDark">@android:color/holo_blue_dark</item> <item name="android:colorPrimary">@android:color/holo_blue_light</item> <item name="android:navigationBarColor">@android:color/transparent</item> </style> </resources>
2. 定义字符串: strings.xml
<resources> <string name="app_name">Adapter</string> <string name="action_settings">Settings</string> <!-- 案例一:静态Spinner --> <string name="skill">专业技能</string> <string-array name="skills"> <item>Android</item> <item>Java</item> <item>C</item> <item>IOS</item> </string-array> <string name="title_activity_static_spinner">静态Spinner</string> <!-- 案例二:动态Spinner --> <string name="title_activity_dynamic_spinner">动态Spinner</string> <string name="btn_remove">删除选中项</string> <string name="btn_add">新增选项</string> <string name="skill_hint">已掌握的技能</string> <!-- 案例三:列表框 单选 --> <string name="title_activity_list_view_acitivity">列表框 单选</string> <string name="click">点击了</string> <!-- 案例四:列表框 多选 --> <string name="title_activity_multiple_list_view">列表框 多选</string> <string name="btn_choose">选中的项</string> <string name="name">联系人:</string> <string name="phone">号码:</string> </resources>
3. 创建四个案例的Activity:
StaticSpinnerActivity、DynamicSpinnerActivity、ListViewAcitivity、MultipleListViewActivity
4. 功能清单文件中设置返回按钮: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xiangdong.adapter" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".StaticSpinnerActivity" android:label="@string/title_activity_static_spinner" android:parentActivityName=".MainActivity" > </activity> <activity android:name=".DynamicSpinnerActivity" android:label="@string/title_activity_dynamic_spinner" android:parentActivityName=".MainActivity" > <intent-filter> <action android:name="com.lxd.intent.action.DYNAMIC_SPINNER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".ListViewAcitivity" android:label="@string/title_activity_list_view_acitivity" android:parentActivityName=".MainActivity" > </activity> <activity android:name=".MultipleListViewActivity" android:label="@string/title_activity_multiple_list_view" android:parentActivityName=".MainActivity"> </activity> </application> </manifest>
5. 写主界面: activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:id="@+id/btnStaticSpinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/title_activity_static_spinner"/> <Button android:id="@+id/btnDynamicSpinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btnStaticSpinner" android:onClick="onClick" android:text="@string/title_activity_dynamic_spinner"/> <Button android:id="@+id/btnListView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btnDynamicSpinner" android:onClick="onClick" android:text="@string/title_activity_list_view_acitivity"/> <Button android:id="@+id/btnMultipleListView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/btnListView" android:onClick="onClick" android:text="@string/title_activity_multiple_list_view"/> </RelativeLayout>
注意:
这些按钮都有点击事件,因此在主界面写按钮的时候,都要写上:
android:onClick="onClick"
本人在刚开始开发的时候,就忘记写这句话了,因此在点击按钮的时候,就没有跳转。
6. 写主活动: MainActivity
package com.xiangdong.adapter; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View view) { // Intent intent = new Intent(this,StaticSpinnerActivity.class); Intent intent = new Intent(); switch (view.getId()) { case R.id.btnStaticSpinner: // 显式意图:设置由当前界面跳转至指定界面 intent.setClass(this, StaticSpinnerActivity.class); break; case R.id.btnDynamicSpinner: //隐式意图 intent.setAction("com.lxd.intent.action.DYNAMIC_SPINNER"); break; case R.id.btnListView: // 显式意图:设置由当前界面跳转至指定界面 intent.setClass(this, ListViewAcitivity.class); break; case R.id.btnMultipleListView: // 显式意图:设置由当前界面跳转至指定界面 intent.setClass(this, MultipleListViewActivity.class); break; } //启动意图 startActivity(intent); } //--------以下代码不做更改---------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
注意:
创建意图、通过显式/隐式意图实现动作(跳转)、启动意图。三步骤缺一不可。尤其是启动意图的这句话容易遗漏:
startActivity(intent);
本人在刚开始开发的时候,就忘记写这句话了,因此在点击按钮的时候,就没有跳转。
7. 静态Spinner
(1)界面: activity_static_spinner.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.adapter.StaticSpinnerActivity"> <TextView android:id="@+id/tvSkill" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/skill"/> <!-- entries:设置指定数组值。 --> <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/tvSkill" android:paddingLeft="10dp" android:entries="@array/skills"/> <TextView android:id="@+id/tvContent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tvSkill" android:gravity="center" android:paddingTop="150dp" android:textSize="30sp"/> </RelativeLayout>
(2)活动: StaticSpinnerActivity
package com.xiangdong.adapter; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.Spinner; import android.widget.TextView; public class StaticSpinnerActivity extends Activity { private Spinner spinner; private TextView tvContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_static_spinner); // 获取字符串数组 // 要传到内部类中,值必须不能改变,因此要用 final 修饰 final String[] skills = this.getResources().getStringArray(R.array.skills); spinner = (Spinner) findViewById(R.id.spinner); tvContent = (TextView) findViewById(R.id.tvContent); // 注册spinner选中item的事件 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { tvContent.setText(skills[position]); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } //--------------------------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_static_spinner, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
8. 动态Spinner
(1)界面: activity_dynamic_spinner.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.adapter.DynamicSpinnerActivity"> <TextView android:id="@+id/tvSkill" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/skill"/> <Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/tvSkill" android:paddingLeft="10dp"/> <EditText android:id="@+id/txtSkill" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/tvSkill" android:paddingTop="150dp" android:hint="@string/skill_hint"/> <Button android:id="@+id/btnRemove" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/txtSkill" android:layout_alignParentRight="true" android:onClick="onClick" android:text="@string/btn_remove"/> <Button android:id="@+id/btnAdd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/txtSkill" android:layout_alignParentLeft="true" android:onClick="onClick" android:text="@string/btn_add"/> </RelativeLayout>
(2)活动: DynamicSpinnerActivity
package com.xiangdong.adapter; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class DynamicSpinnerActivity extends Activity { private EditText txtSkill; private Spinner spinner; //适配器:关联数据与控件 (桥梁作用) private ArrayAdapter<String> adapter; //动态数据 (可来自数据库/网络) private List<String> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamic_spinner); txtSkill = (EditText) findViewById(R.id.txtSkill); // 参数一:上下文(Content) // 参数二:系统中的布局资源 android.R.layout.simple_spinner_dropdown_item // 参数三:数据,可以是字符串资源【长度不可变】,也可以是 ArrayList【长度可变】 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, getData()); spinner = (Spinner) findViewById(R.id.spinner); //控件与适配器关联 spinner.setAdapter(adapter); } private List<String> getData() { // 动态数据 (可来源于数据库/网络) data = new ArrayList<String>(); data.add("Java"); data.add("C"); data.add("Swift"); data.add("C++"); return data; } public void onClick(View view) { switch (view.getId()) { case R.id.btnAdd: add(); break; case R.id.btnRemove: remove(); break; } } private void remove() { // 获取当前选项的下标(索引) int position = spinner.getSelectedItemPosition(); if (position == -1) { Toast.makeText(this, "无选中项.", Toast.LENGTH_SHORT).show(); } else { // 删除指定下标的选项 data.remove(position); // 适配器通知【视图】数据集已改变,视图会重绘。 adapter.notifyDataSetChanged(); } } private void add() { String skill = txtSkill.getText().toString(); if (skill == null || skill.trim().length() == 0) { Toast.makeText(this, "请输入技能.", Toast.LENGTH_SHORT).show(); } else { txtSkill.setText(""); //在数据中添加新内容 data.add(skill); //获得列表的适配器中数据项的总数 int size = spinner.getAdapter().getCount(); // size = data.size(); //设置选中项的位置 spinner.setSelection(size - 1); // 适配器通知【视图】数据集已改变,视图会重绘。 adapter.notifyDataSetChanged(); } } //------------以下代码不做更改------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_dynamic_spinner, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
9. 列表框 单选
(1)界面: activity_list_view_acitivity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.adapter.ListViewAcitivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </RelativeLayout>
(2)活动: ListViewAcitivity
package com.xiangdong.adapter; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; public class ListViewAcitivity extends Activity { private ListView listView; private ArrayList<String> data; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view_acitivity); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData()); listView = (ListView) findViewById(R.id.listView); // 设置选中模式 为 单选 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setAdapter(adapter); // 列表框 点击选项 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, longid) { String dataItem = data.get(position); Toast.makeText(getApplicationContext(), getString(R.string.click) + dataItem, Toast.LENGTH_SHORT).show(); //点击跳转页面 //Intent intent = new Intent(); //intent.setAction("com.lxd.intent.action.DYNAMIC_SPINNER"); //startActivity(intent); } }); } private ArrayList<String> getData() { data = new ArrayList<String>(); for (int i = 0; i < 30; i++) { data.add("Item " + i); } return data; } //----------------------------------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_list_view_acitivity, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
10. 列表框 多选
(1)界面: activity_multiple_list_view.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.xiangdong.adapter.MultipleListViewActivity"> <ListView android:id="@+id/listView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/btnChoose" android:layout_alignParentStart="true" android:layout_alignParentTop="true"/> <Button android:id="@+id/btnChoose" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:onClick="onClick" android:text="@string/btn_choose"/> </RelativeLayout>
(2)活动: MultipleListViewActivity
package com.xiangdong.adapter; import android.app.Activity; import android.os.Bundle; import android.util.SparseBooleanArray; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import java.util.ArrayList; import java.util.HashMap; import java.util.Objects; public class MultipleListViewActivity extends Activity { //数据的标签(KEY) private static final String KEY_NAME = "name"; private static final String KEY_PHONE = "phone"; //视图 private ListView listView; //数据:由键值对构成的列表【供简单适配器使用】 private ArrayList<HashMap<String, Object>> data; //适配器:简单适配器 (一行可以显示多个控件) private SimpleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_multiple_list_view); //数据的 KEY 构成的数组 String[] from = {KEY_NAME, KEY_PHONE}; // 控件的 ID 构成的数组 int[] to = {android.R.id.text1, android.R.id.text2}; // 参数一:上下文 // 参数二:数据 // 参数三:系统布局模版【activated 代表可高亮显示,2 代表有两个控件】 // simple_list_item_activated_2 // simple_list_item_multiple_choice (CheckBox) // simple_list_item_single_choice (RadioButton) // 参数四:数据的 KEY 构成的数组 // 参数五:控件的 ID 构成的数组 adapter = new SimpleAdapter( getApplicationContext(), getData(), android.R.layout.simple_list_item_activated_2, from, to); listView = (ListView) findViewById(R.id.listView); // 设置为多选模式 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // 设置适配器 listView.setAdapter(adapter); } /** * 初始化数据 * * @return */ private ArrayList<HashMap<String, Object>> getData() { // ArrayList 表示一行的数据 // HashMap 表示一行中的多个数据 data = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < 30; i++) { HashMap<String, Object> item = new HashMap<String, Object>(); item.put(KEY_NAME, getString(R.string.name) + i); item.put(KEY_PHONE, getString(R.string.phone) + i); data.add(item); } return data; } public void onClick(View view) { // 获得选中项的总数 int count = listView.getCheckedItemCount(); // 获得选中项的标识【使用SQLite及游标时可用】 long[] ids = listView.getCheckedItemIds(); // 获得选中的位置【单选】 int position = listView.getCheckedItemPosition(); // 获得选中的位置【多选,获得一个稀疏矩阵】 SparseBooleanArray array = listView.getCheckedItemPositions(); // 显示结果 Toast.makeText(this, array.toString(), Toast.LENGTH_SHORT).show(); } //--------以下代码不做更改-------------------------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_multiple_list_view, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }