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

[b][size=large]本文围绕以下三个部分展开: [/size][/b]

[b][size=large]一、适配器视图与适配器(AdapterView & Adapter)[/size][/b]
[b][size=large]二、四个案例[/size][/b]
[size=medium][b]1. 静态Spinner[/b][/size]
[size=medium][b]2. 动态Spinner[/b][/size]
[size=medium][b]3. ListView 单选[/b][/size]
[size=medium][b]4. ListView 多选[/b][/size]

[b][size=large]附 代码补充[/size][/b]


[b][size=large]一、适配器视图与适配器(AdapterView & Adapter)[/size][/b]

[size=medium][b]1. 适配器视图:[/b][/size]

[size=medium]它继承自视图组(一个包含其他子视图的容器),是需要适配器的视图容器。[/size]

[size=medium]常用的适配器视图有:Spinner(单行下拉列表框)、ListView、GridView、Gallery、ViewPager。[/size]

[size=medium][b]2. 适配器:[/b][/size]

[size=medium]它在视图与数据之间扮演了一个桥梁的作用,将数据中的每一项数据转化为适配器视图可以使用的每一个视图项。[/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4739/b98c6b8c-ee80-3087-a4a2-d0d53fccc374.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4741/19fa2aa4-637b-3438-a599-875b4e878eb8.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4743/f96c591c-3755-335d-8034-b0c985e42c02.png[/img][/align]

[size=medium][b]3. Spinner:[/b][/size]

[size=medium]包括静态Spinner和动态Spinner。[/size]

[size=medium]Spinner有两种定义方式:[/size]

[size=medium](1)使用静态资源。 [/size]

[size=medium]使用资源文件中的字符串数组,数据是固定的;这是最常用、最简单的方式。[/size]

[size=medium](2)使用适配器。[/size]

[size=medium]使用数组适配器(ArrayAdapter),数据长度可变。[/size]


[b][size=large]二、四个案例[/size][/b]

[size=medium][b]1. 静态Spinner[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4745/e4f4fe62-31e8-3ab1-ab31-9639d33f2413.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4747/f38625ab-3d95-3682-a9f5-16f1069adae6.png[/img][/align]

[size=medium][b]说明:[/b][/size]

[size=medium] “专业技能”后面的单行下拉列表框,默认有4个值,单击哪个,正文中就会显示哪个。[/size]

 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) {

}
});
}


[size=medium][b]2. 动态Spinner[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4749/c0249653-4d5a-3bc5-ade5-1a2427aea1d9.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4751/d249708b-f8fa-3cea-a957-b9993a35bdf5.jpg[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4753/83c17460-e0d0-3a63-9cbb-22a6803f4b81.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4755/4673791a-fc3a-3161-88fe-9b959f1d38e8.jpg[/img][/align]

[size=medium][b]说明:[/b][/size]

[size=medium]在文本框中输入技能,点击“新增选项”,该技能就会新增到上面的单行下拉列表框中。[/size]

[size=medium]在文本框中不输入内容,点击“新增选项”时,会弹出“请输入技能.”的提示。[/size]

[size=medium]当点击“删除选中项”将单行下拉列表框中的技能全部删除后,再点击“删除选中项”,会弹出“无选中项.”的提示。[/size]

 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();
}
}



[size=medium][b]补充:【重要!】Spinner使用ArrayAdapter[/b][/size]

[size=medium][b]补充一:[/b][/size]

[size=medium][b](1)[/b]与数组结合:[/size]

// 初始化控件
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
}
});


[size=medium][b](2)[/b]与集合结合:[/size]

        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);



[size=medium][b]补充二:设置Spinner外观:[/b][/size]

[size=medium][b](1)外观1:[/b][/size]

        // 外观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和未展开的菜单都是一种布局样式。


[align=center][img]http://dl2.iteye.com/upload/attachment/0111/6461/461fe9b8-8800-30b7-9d99-f39b01d80366.jpg[/img][/align]

[size=medium][b](2)外观2:[/b][/size]

        // 外观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:也是内置布局。
// 它设置的是:展开的时候下拉菜单的样式。(它应用于下拉)


[align=center][img]http://dl2.iteye.com/upload/attachment/0111/6463/bb420591-54ce-3656-a713-5782dc1cbfea.jpg[/img][/align]


[size=medium][b]3. ListView 单选[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4757/056db91b-7b5a-3a16-aa62-681480e82fdd.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4759/7aeeca5a-f857-3a57-ae27-1a8c86e9a943.png[/img][/align]

[size=medium][b]说明:[/b][/size]

[size=medium]界面中从“Item 1”一直到“Item 30”。[/size]

[size=medium]当点击其中一项,比如“Item 6”的时候,会弹出“点击了Item 6”的提示。[/size]

 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;
}


[size=medium][b]4. ListView 多选[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4761/e58a4123-071c-3978-86e9-e36c44ad4f5b.png[/img][/align]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4763/8019dec3-bcea-3fdd-91b6-1365571f4fae.png[/img][/align]

[size=medium][b]说明:[/b][/size]

[size=medium]选中其中的几项后,点击“选中的项”,会弹出提示。[/size]

 //数据的标签(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();
}



[b][size=large]附 代码补充[/size][/b]

[size=medium][b]1. 设置标题栏等颜色: styles.xml(v21) [/b][/size]

 <?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>



[size=medium][b]2. 定义字符串: strings.xml[/b][/size]

 <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>



[size=medium][b]3. 创建四个案例的Activity:[/b][/size]

[size=medium]StaticSpinnerActivity、DynamicSpinnerActivity、ListViewAcitivity、MultipleListViewActivity[/size]


[size=medium][b]4. 功能清单文件中设置返回按钮: AndroidManifest.xml[/b][/size]

 <?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>



[size=medium][b]5. 写主界面: activity_main.xml[/b][/size]

[align=center][img]http://dl2.iteye.com/upload/attachment/0110/4765/5e33c0ce-4b35-3332-a497-f1033eaff046.png[/img][/align]

 <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>


[size=medium][b]注意:[/b][/size]

[size=medium]这些按钮都有点击事件,因此在主界面写按钮的时候,都要写上:[/size]

android:onClick="onClick"


[size=medium]本人在刚开始开发的时候,就忘记写这句话了,因此在点击按钮的时候,就没有跳转。[/size]


[size=medium][b] 6. 写主活动: MainActivity[/b][/size]

 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);
}
}


[size=medium][b]注意:[/b][/size]

[size=medium] 创建意图、通过显式/隐式意图实现动作(跳转)、启动意图。三步骤缺一不可。尤其是启动意图的这句话容易遗漏:[/size]

startActivity(intent);


[size=medium]本人在刚开始开发的时候,就忘记写这句话了,因此在点击按钮的时候,就没有跳转。[/size]


[size=medium][b]7. 静态Spinner[/b][/size]

[size=medium](1)界面: activity_static_spinner.xml[/size]

 <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>


[size=medium](2)活动: StaticSpinnerActivity[/size]

 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);
}
}



[size=medium][b]8. 动态Spinner[/b][/size]

[size=medium](1)界面: activity_dynamic_spinner.xml[/size]

 <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>


[size=medium](2)活动: DynamicSpinnerActivity[/size]

 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);
}
}



[size=medium][b]9. ListView 单选[/b][/size]

[size=medium](1)界面: activity_list_view_acitivity.xml[/size]

 <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>


[size=medium](2)活动: ListViewAcitivity[/size]

 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);
}
}



[size=medium][b]10. ListView 多选[/b][/size]

[size=medium](1)界面: activity_multiple_list_view.xml[/size]

 <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>


[size=medium](2)活动: MultipleListViewActivity[/size]

 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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值