`
XiangdongLee
  • 浏览: 91205 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

 
阅读更多
本文围绕以下三个部分展开:

一、适配器视图与适配器(AdapterView & Adapter)
二、四个案例
        1. 静态Spinner
        2. 动态Spinner
        3. ListView 单选
        4. ListView 多选

附   代码补充






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



        补充:【重要!】Spinner使用ArrayAdapter

        补充一:

        (1)与数组结合:

// 初始化控件
Spinner spinner = (Spinner) findViewById(R.id.spinner1);
// 建立数据源
String[] mItems = getResources().getStringArray(R.array.languages);
// 建立Adapter并且绑定数据源
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//绑定 Adapter到控件
spinner .setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, 
            int pos, long id) {
    
        String[] languages = getResources().getStringArray(R.array.languages);
        Toast.makeText(MainActivity.this, "你点击的是:"+languages[pos], 2000).show();
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }
});


        (2)与集合结合:

        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        List<String> list = new ArrayList<String>();
        list.add("Java");
        list.add("C");
        list.add("Swift");
        list.add("C++");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item,
                list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);



        补充二:设置Spinner外观:

        (1)外观1:

        // 外观1:
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item,
                list);
        // android.R.layout.simple_spinner_item:是系统自带的内置布局。
        //     它设置的是:Spinner未展开菜单时Spinner的默认样式。(它应用于Spinner本身)
        //     如果只用它,会导致:展开的sipnner和未展开的菜单都是一种布局样式。




        (2)外观2:

        // 外观2的第一种写法:
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item,
                list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // 外观2的第二种写法:
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_dropdown_item,
                list);
        // android.R.layout.simple_spinner_dropdown_item:也是内置布局。
        //     它设置的是:展开的时候下拉菜单的样式。(它应用于下拉)






        3. ListView 单选





        说明:

        界面中从“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. ListView 多选





        说明:

        选中其中的几项后,点击“选中的项”,会弹出提示。

 //数据的标签(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. ListView 单选

        (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. ListView 多选

        (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);  
     }  
 }
  • 大小: 187.5 KB
  • 大小: 189.8 KB
  • 大小: 318 KB
  • 大小: 29.3 KB
  • 大小: 22.4 KB
  • 大小: 38.7 KB
  • 大小: 11.1 KB
  • 大小: 36.1 KB
  • 大小: 12.3 KB
  • 大小: 31.3 KB
  • 大小: 33.4 KB
  • 大小: 40.1 KB
  • 大小: 65.8 KB
  • 大小: 31.9 KB
  • 大小: 5.5 KB
  • 大小: 7.6 KB
0
1
分享到:
评论

相关推荐

    24学时攻克c++

    根据提供的信息,“24学时攻克C++”这本书旨在通过一系列高效的学习计划帮助读者在较短的时间内掌握C++编程语言。尽管仅上传了23页的内容,我们仍然可以从书名、描述以及部分可见的内容中推断出一些关键知识点。 ##...

    攻克Data动态获取网页评论,保存数据库

    【攻克Data动态获取网页评论,保存数据库】是一个关于利用特定工具——攻克Data,来抓取网页上的评论数据并存储到数据库的过程。这个过程涉及到网络爬虫技术、JSON解析以及数据库管理等多个IT领域的知识点。 1. **...

    大学生攻克Linux系统教程

    【大学生攻克Linux系统教程】 本教程专为对Linux操作系统感兴趣的初学者设计,旨在提供一个从零开始学习Linux的全面指南。教程内容涵盖了Linux系统的安装、基本操作、文本编辑器VI的使用、调试工具GDB的基础知识,...

    【备战2014】高考生物 精讲巧解分类攻克11

    【备战2014】高考生物 精讲巧解分类攻克11

    【备战2014】高考数学 精讲巧解分类攻克11

    2. **三视图的理解与应用**:三视图是指物体在三个互相垂直的方向上的投影,包括俯视图、主视图和侧视图。不同几何体的三视图可以反映出物体的形状和尺寸,是解决实际问题和高考数学中的常见考点。 3. **几何体的...

    24小时攻克c++代码

    《24小时攻克C++代码》是一门针对C++编程语言深入浅出的学习教程,旨在帮助初学者在短时间内掌握C++编程基础,并逐步提升至进阶水平。C++是一种广泛应用的面向对象编程语言,它的强大功能和高效性能使得它在系统软件...

    Android应用源码之Fanfoudroid(饭否网开源项目)-IT计算机-毕业设计.zip

    3) 功能实现与难点攻克;4) 性能优化与用户体验;5) 项目总结与展望。通过深入分析源码,结合自己的理解和创新,可以写出具有深度的毕业论文。 总的来说,“Fanfoudroid”项目为Android初学者和开发者提供了一个...

    大学生攻克Linux系统教程.rar

    本书汇集众多Linux学习者的心血与贡献,有很多作者在默默的为你呼喊,感谢他们的贡献。从学习Linux的那天起,我只记住一个词,那就是攻克。 一个障碍,一个学习Linux的最大障碍-无指导-在困扰着每一位企图闯出...

    8天攻克8000英语词汇

    8天攻克8000词汇,word版,方便学习,背单词的好东东

    新东方8天攻克8000单词魔鬼训练营

    标题中的“新东方8天攻克8000单词魔鬼训练营”揭示了一个高效学习英语单词的课程项目。新东方作为知名的教育机构,以其在英语教学领域的专业性而著称,这个训练营可能是一个针对英语学习者设计的高强度、短期记忆...

    24学时攻克c++_笔记

    ### 11. 引用 引用提供了一种不同于指针的访问变量的方式,它们类似于别名,但不能被重新赋值。了解何时使用引用而不是指针对于编写高效、清晰的代码至关重要。 ### 12. 高级引用和指针 结合使用指针和引用,可以...

    攻克Data-数据采集与存储-适用于各个平台数据爬虫

    "攻克Data-数据采集与存储-适用于各个平台数据爬虫"这个主题聚焦于如何有效地从各种平台抓取并存储数据。在这个过程中,爬虫技术扮演了关键角色,它能够自动化地从互联网上获取大量信息。现在,让我们深入探讨相关...

    Android自动来电录音

    在Android平台上实现自动来电录音是一项技术挑战,但并非无法攻克。Android系统提供了丰富的API和工具,使得开发者可以创建各种功能丰富的应用,包括来电录音。在本文中,我们将深入探讨如何利用Android的...

    【备战2014】高考地理 精讲巧解分类攻克11

    3. 北京市降水量与日照时数:降水量与日照时数受多种因素影响,包括季节变化、天气系统和地理位置等。2008年北京的降水量可能对当年的气候和农业生产有直接影响,例如4、5月降水多可缓解旱情,而7月降水少可能与夏季...

    如何深入学习Android Framework.pdf

    #### 三、Android Framework的概念与结构 1. **概念**:Android Framework是Android系统的核心组成部分,它位于Linux内核之上,主要包括Java层、Native层和HAL层。这些层共同支撑着Android系统的运行。 2. **结构*...

    攻克超高层悬挑工字钢与铝合金模板多次搭接难题QC.ppt

    攻克超高层悬挑工字钢与铝合金模板多次搭接难题QC

    UGNX3.0完全攻克秘籍

    1. **用户界面与工作环境**:UGNX3.0的用户界面包括菜单栏、工具栏、工作区、视图控制区等,理解这些元素的功能布局对于高效操作至关重要。 2. **建模基础**:涵盖实体建模、曲面建模和线框建模,学习如何创建基本...

    【备战2014】高考历史 精讲巧解分类攻克11

    11. 战后美国经济繁荣:从“复苏”到“繁荣”的主要原因可以归因于国家垄断资本主义的发展,即政府与企业之间的紧密合作,推动了经济的快速增长。 12. 产业结构变化:高收入国家工业比重的下降反映了全球经济的结构...

    24学时攻克C++源码及习题答案

    在学习编程语言C++的过程中,24学时的课程安排是一个相当常见的学习进度,这个压缩包文件名为"24学时攻克C++源码及习题答案",显然是为初学者设计的一套完整教程。C++是面向对象编程的重要语言,它的强大功能和广泛...

Global site tag (gtag.js) - Google Analytics