当前位置: 代码迷 >> Android >> 【攻占Android (11)】适配器视图与适配器
  详细解决方案

【攻占Android (11)】适配器视图与适配器

热度:24   发布时间:2016-04-27 23:46:40.0
【攻克Android (11)】适配器视图与适配器
本文围绕以下三个部分展开:

一、适配器视图与适配器(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);       }   }


  相关解决方案