安卓第六天筆記--ListView,安卓--listview
安卓第六天筆記--ListView
1.AdapteView
AdapteView 繼承ViewGroup它的本質是容器
AdapterView派生了3個子類:
AbsListView
AbsSpinner
AdapterViewAnimation
這3個類是抽象類
實際使用中采用的是它們的子類

2.Adpate結構

3.使用ArrayAdapter完成ListView顯示

ListView使用的是ListAdapter類型的適配器
由於只顯示文字,所有使用ArrayAdapter
ArrayAdapter 是ListAdapter的子類
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--
divider:分隔線顏色
dividerHeight:分隔線高度
ListView
建議 layout_width:與 layout_height 都設置為match_parent
要預覽的話要有ID屬性
-->
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/colorAccent"
android:dividerHeight="2dp">
</ListView>
</LinearLayout>
Activity
/**
* ListView使用
* ArrayAdapter適配器
*/
public class MainActivity extends AppCompatActivity {
/*
ListView
*/
private ListView lv;
private String [] items={
"孫悟空",
"豬八戒",
"牛魔王",
"JAVA",
"Android",
"Ajax",
"XML",
"Spring",
"Hibernate",
"Spring MVC",
"MyBatis"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
/*
public ArrayAdapter(Context context, @LayoutRes int resource, @NonNull T[] objects)
context:上下文
*/
//為ListView設置適配器
lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,items));
}
}
android.R.layout.simple_list_item_1
內部就是一個TextView
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall" />
4.使用SimpleAdapter
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
@LayoutRes int resource, String[] from, @IdRes int[] to)
context:上下文
LIst<? extends Map<String,/.>> data: 集合類型的對象,每個元素都是一個Map<String,?>對象
resource:提定一個界面布局的ID,布局文件
from:該參數提取Map<String,?>的key
to:int[]類型的參數決定填充哪些控件

布局文件:

![]()
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.itheima.listviewsimpleadapter.MainActivity">
<!--
ListView
-->
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
View Code
listview填充的布局文件

![]()
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<!--
頭像顯示
-->
<ImageView
android:id="@+id/iv_icon"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:src="@drawable/libai"/>
<!--
右邊顯示 姓名與描述
-->
<LinearLayout
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="這裡顯示姓名"/>
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="這裡顯示描述"/>
</LinearLayout>
</LinearLayout>
View Code
Activity中SimpleAdapter

![]()
/**
* ListView
* SimpleAdapter實現
* @author 劉楠
*/
public class MainActivity extends AppCompatActivity {
private ListView lv;
/*
姓名
*/
private String[] names = {
"孫悟空",
"豬八戒",
"牛魔王",
"JAVA"
};
/*
* 圖片資源ID*/
private int[] resourceID = {
R.drawable.libai,
R.drawable.nongyu,
R.drawable.qingzhao,
R.drawable.tiger
};
private String[] desc = {
"一個猴子",
"一頭豬",
"一頭牛",
"一門開發語言"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
//創建一個List集合
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
//為List添加元素
for (int i = 0; i < names.length; i++) {
//聲明一個Map
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", names[i]);
map.put("icon", resourceID[i]);
map.put("desc", desc[i]);
//添加到集合
listItems.add(map);
}
//創建一個SimpleAdapter
/*
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
@LayoutRes int resource, String[] from, @IdRes int[] to) {
context:上下文
LIst<? extends Map<String,/.>> data: 集合類型的對象,每個元素都是一個Map<String,?>對象
resource:提定一個界面布局的ID,布局文件
from:該參數提取Map<String,?>的key
to:int[]類型的參數決定填充哪些控件
*/
SimpleAdapter simpleAdapter =
new SimpleAdapter(this, listItems, R.layout.simple_item, new String[]{"name", "icon", "desc"},new int[]{R.id.tv_name,R.id.iv_icon,R.id.tv_desc});
//為listview設置適配器
lv.setAdapter(simpleAdapter);
}
}
View Code
5.使用BaseAdapter
BaseAdapter要實現 以下方法:
getCount():方法返回控制該Adapter將會包含多少個列表項
getItem(int position): 該方法的返回值決定第Position處的列表項的內容
getItemId(int position): 該方法的返回值決定第Position處的列表項的內容的ID
getView(int position,View conerView ,ViewGroup parent)
這個方法絕決返回值第posistion處的列表項
5.1.創建一個學生信息錄入,使用ListView展示信息baseAdapter


布局

![]()
<LinearLayout 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:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="學生信息管理系統"
android:textColor="#77ff0000"
android:textSize="29sp" />
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入學生姓名" />
<!-- 性別 -->
<RadioGroup
android:id="@+id/rgp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- 性別男 -->
<RadioButton
android:id="@+id/rb_male"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:checked="true"
android:text="male" />
<!-- 性別女 -->
<RadioButton
android:id="@+id/rb_female"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="female" />
</RadioGroup>
<!-- 保存 -->
<Button
android:id="@+id/btn_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存" />
<!-- 查詢 -->
<Button
android:id="@+id/btn_querty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查詢全部學生信息" />
<ListView
android:id="@+id/lv_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="#ff0000"
android:dividerHeight="2dp">
</ListView>
</LinearLayout>
View Code
ListView要使用的布局

![]()
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/iv_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_margin="20dp"
android:src="@drawable/mr" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_toRightOf="@id/iv_sex" >
<TextView
android:id="@+id/tv_no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="學號" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_no"
android:text="姓名" />
<ImageView
android:id="@+id/iv_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_margin="20dp"
android:src="@drawable/delete" />
</RelativeLayout>
</RelativeLayout>
View Code
數據庫創建類

![]()
/**
* 數據庫創建類,與維護的類 繼承SQLiteOpenHelper
* @author 劉楠
*
* 2016-2-20下午6:32:00
*/
public class StudentSqliteOpenHelper extends SQLiteOpenHelper {
private static final String TAG = "StudentSqliteOpenHelper";
public StudentSqliteOpenHelper(Context context) {
super(context, "student.db", null, 2);
}
/**
* 創建數據庫時,執行一次,只執行一次
* 用來創建數據表
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, "onCreate執行了");
//獲取原來的版本,獲取不到為0
int version = db.getVersion();
if(version==0){
//創建表
String sql= "create table students ( _id integer primary key autoincrement, name varchar(30),gender varchar(10))";
db.execSQL(sql);
}else{
//創建表
String sql= "create table students ( _id integer primary key autoincrement, name varchar(30))";
db.execSQL(sql);
}
}
/**
* 當數據庫版本發生變化時執行
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG, "onUpgrade執行了");
switch (oldVersion) {
case 1:
String sql= "alter table students add gender varchar(10)";
db.execSQL(sql);
break;
case 2:
break;
default:
break;
}
}
}
View Code
實體類

![]()
/**
* 學生的封裝類
*
* @author 劉楠
*
* 2016-2-20下午6:31:20
*/
public class Student {
/*
* ID
*/
private int id;
/*
* 姓名
*/
private String name;
/*
* 性別
*/
private String gender;
public Student() {
super();
}
public Student(int id, String name, String gender) {
super();
this.id = id;
this.name = name;
this.gender = gender;
}
public String getGender() {
return gender;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setGender(String gender) {
this.gender = gender;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
View Code
數據庫工具類

![]()
/**
* 學生數據庫訪問工具類
*
* @author 劉楠
*
* 2016-2-20下午6:45:03
*/
public class StudentDao {
/*
* 數據庫創建更新類
*/
private StudentSqliteOpenHelper helper;
public StudentDao(Context context) {
helper = new StudentSqliteOpenHelper(context);
}
/**
* 插入一條記錄
*
* @param name
* 姓名
* @param gender
* 性別
* @return 返回插入後的_id
*/
public long insert(String name, String gender) {
// 獲取數據庫
SQLiteDatabase db = helper.getWritableDatabase();
// 插入的列
String nullColumnHack = "values(null,?,?)";
// 占位符
ContentValues values = new ContentValues();
values.put("name", name);
values.put("gender", gender);
// 執行
long insert = db.insert("students", nullColumnHack, values);
// 關閉連接
db.close();
return insert;
}
/**
* 修改一條記錄
*
* @param name
* 姓名
* @param gender
* 性別
* @return 返回插入後的_id
*/
public long update(String name, String gender) {
// 獲取數據庫
SQLiteDatabase db = helper.getWritableDatabase();
// 插入的列
// 占位符
ContentValues values = new ContentValues();
values.put("gender", gender);
// 執行
int update = db.update("students", values, "name = ?",
new String[] { name });
// 關閉連接
db.close();
return update;
}
/**
* 刪除一條記錄
*
* @param name
* 姓名
*
* @return 返回刪除後的_id
*/
public int delete(String name) {
// 獲取數據庫
SQLiteDatabase db = helper.getWritableDatabase();
// 執行
int delete = db.delete("students", "name = ?", new String[] { name });
// 關閉連接
db.close();
return delete;
}
/**
* 查詢全部學生信息
*
* @return
*/
public List<Student> getAll() {
// 容器
List<Student> list = new ArrayList<Student>();
// 獲取數據庫
SQLiteDatabase db = helper.getReadableDatabase();
String[] columns = { "_id", "name", "gender" };
Cursor cursor = db.query("students", columns, null, null, null, null,
null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String gender = cursor.getString(cursor.getColumnIndex("gender"));
// 添加到集合中
list.add(new Student(id, name, gender));
}
// 關閉游標
cursor.close();
// 關閉
db.close();
return list;
}
}
View Code
Activity
/**
* 學生管理信息系統Activity

![]()
* 步驟
* 1.獲取用戶輸入姓名與選擇的性別
* 2.判斷是否為空,為空就提示,不為空
* 3.保存數據
* 4.點擊查詢,在下方的ListView中顯示所有的學生信息
* 5.為ListView設置BaseAdapter
* 6.實現getCount與getView方法
* 7.返回view
* 8.點擊刪除,彈出提示對話框,
* 9.取消什麼也不做,確定就刪除當前記錄
* @author 劉楠
*
* 2016-2-20下午8:59:43
*/
public class MainActivity extends Activity implements OnClickListener {
/*
* 姓名
*/
private EditText et_name;
/*
* 性別
*/
private RadioGroup rgp;
/*
* 保存
*/
private Button btn_save;
/*
* 查詢
*/
private Button btn_querty;
/*
* 學生列表
*/
private ListView lv_item;
/*
* 學生表數據庫操作類
*/
private StudentDao studentDao;
/*
* 學生列表
*/
private List<Student> list;
/*
* 學生列表適配器
*/
private StuBaseAdapter stuBaseAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
rgp = (RadioGroup) findViewById(R.id.rgp);
btn_save = (Button) findViewById(R.id.btn_save);
btn_querty = (Button) findViewById(R.id.btn_querty);
lv_item = (ListView) findViewById(R.id.lv_item);
/*
* 初始化數據庫學生表的工具類
*/
studentDao = new StudentDao(this);
/*
* 設置監聽事件
*/
btn_save.setOnClickListener(this);
btn_querty.setOnClickListener(this);
}
/**
* 單擊事件監聽器
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_save:
// 保存
save();
break;
case R.id.btn_querty:
// 查詢
query();
break;
}
}
/**
* 查詢學生列表
*/
private void query() {
refresh();
}
private void refresh() {
/*
* 查詢全部學生信息
*/
list = studentDao.getAll();
if (stuBaseAdapter == null) {
// 判斷 為空就new ,為ListView設置適配器
stuBaseAdapter = new StuBaseAdapter();
lv_item.setAdapter(stuBaseAdapter);
} else {
// 通知ListView列表改變
stuBaseAdapter.notifyDataSetChanged();
}
}
/**
* 保存學生信息
*/
private void save() {
// 獲取學生輸入的信息
String name = et_name.getText().toString().trim();
// 判斷
if (TextUtils.isEmpty(name)) {
Toast.makeText(this, "學生姓名不能為空", Toast.LENGTH_SHORT).show();
return;
}
// 獲取性別
String gender = "male";
switch (rgp.getCheckedRadioButtonId()) {
case R.id.rb_male:
gender = "male";
break;
case R.id.rb_female:
gender = "female";
break;
}
// 開始保存
long insert = studentDao.insert(name, gender);
if (insert > 0) {
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
et_name.setText("");
} else {
Toast.makeText(this, "保存失敗", Toast.LENGTH_SHORT).show();
}
}
/**
* 學生列表適配器
*
* @author 劉楠
*
* 2016-2-20下午7:28:15
*/
private class StuBaseAdapter extends BaseAdapter {
private static final String TAG = "StuBaseAdapter";
@Override
public int getCount() {
return list.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, position + "");
View view;
if (convertView == null) {
view = View.inflate(MainActivity.this, R.layout.stu_item, null);
} else {
view = convertView;
}
// 得到學生對象
final Student student = list.get(position);
ImageView iv_sex = (ImageView) view.findViewById(R.id.iv_sex);
if ("male".equals(student.getGender())) {
iv_sex.setImageResource(R.drawable.mr);
} else if ("female".equals(student.getGender())) {
iv_sex.setImageResource(R.drawable.miss);
}
TextView tv_no = (TextView) view.findViewById(R.id.tv_no);
tv_no.setText("編號:" + student.getId());
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
tv_name.setText("姓名:" + student.getName());
ImageView iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
iv_delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 對話框來提示用戶是否刪除
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setTitle("刪除").setIcon(R.drawable.tools)
.setMessage("確定要刪除這條記錄嗎");
builder.setPositiveButton("確定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
/*
* 刪除方法
*/
int delete = studentDao.delete(student.getName());
if (delete > 0) {
Toast.makeText(MainActivity.this, "刪除成功",
Toast.LENGTH_SHORT).show();
// 刷新列表
refresh();
} else {
Toast.makeText(MainActivity.this, "刪除失敗",
Toast.LENGTH_SHORT).show();
}
}
});
builder.setNegativeButton("取消", null);
builder.create().show();
}
});
return view;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
}
}
View Code
6.GridView與ExpandableListView
GridView:和ListView有共同的父類,都是AbsListView,與ListView很相似
區別:ListView只顯示一列
GridView可以顯示多列
numcolumns:屬性可以設置顯示列數
其它用法與ListView一樣
7.Spinner
Spinner其實就是一個列表選擇框,彈出一個菜單提供用戶選擇,
也需要設置Adapter
entries:使用XML資源文件數據設置下拉菜單
pupupBackground:列表 選擇框的背景色
prompt:提示信息

7.1 xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="books">
<item>瘋狂JAVA講義</item>
<item>Android</item>
<item>JAVA EE企業應用</item>
<item>Android 第一行代碼</item>
</string-array>
</resources>
7.2 Avtivity
/**
* Spinner實現
* 設置適配器
* @author 劉楠
*/
public class MainActivity extends AppCompatActivity {
//Spinner
private Spinner spinner;
private String [] names={"東邪","西毒","南帝","北丐","中神通"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) findViewById(R.id.spinner);
//設置適配器
ArrayAdapter<String> arrayAdapter
= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,names);
spinner.setAdapter(arrayAdapter);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.itheima.spinner.MainActivity">
<!--
第一個Spinner使用entries配置XML資源
-->
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/books">
</Spinner>
<!--
第二個沒有配置,
在Activity中設置Adapter
-->
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</Spinner>
</LinearLayout>
8.AdapterViewFlipper的功能與用法
AdapterViewFlipper繼承了AdapterViewAnimator,它也會顯示Adapter提供的多個級件,但它每次只能顯示一個View組件,程序可以通過showPrevious()和showNext()方法控制顯示上一個,下一個,
使用startFlipper()控件自動播放
stopFlipper()停止播放
8.1屬性:
animateFirstView:第一個View是否使用動畫
inAnimation:顯示時使用動畫
loopViews:循環到最後一個時,是否自動轉頭到第一個
outAanimation:設置組件隱藏時使用的動畫
autoStrat()是否自動播放
flipInterval():設置自動播放的時間
8.2自動播放圖片

布局文件
<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.itheima.adapterviewflipper.MainActivity">
<!--
flipInterval 5秒顯示時間
layout_alignParentTop與父窗體頂部對齊
-->
<AdapterViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:flipInterval="5000"/>
<Button
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="prev"
android:text="上一個"/>
<Button
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="auto"
android:text="自動播放"/>
<Button
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="next"
android:text="下一個"/>
</RelativeLayout>
Adapter填充的XML布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_display"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ImageView>
</LinearLayout>
Activity實現
/**
* AdapterViewFlipper
* 步驟1.獲取flipper
* 2.創建資源與適配器
* 3.為flipper設置適配器
*
* @author 劉楠
*/
public class MainActivity extends AppCompatActivity {
/*
flipper
*/
private AdapterViewFlipper flipper;
/*
資源圖片
*/
private int[] imageIds = new int[]
{
R.drawable.shuangzi, R.drawable.shuangyu,
R.drawable.chunv, R.drawable.tiancheng, R.drawable.tianxie,
R.drawable.sheshou, R.drawable.juxie, R.drawable.shuiping,
R.drawable.shizi, R.drawable.baiyang, R.drawable.jinniu,
R.drawable.mojie};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flipper = (AdapterViewFlipper) findViewById(R.id.flipper);
//聲明適配器
BaseAdapter baseAdapter = new BaseAdapter() {
@Override
public int getCount() {
return imageIds.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = View.inflate(MainActivity.this, R.layout.images, null);
} else {
view = convertView;
}
ImageView display = (ImageView) view.findViewById(R.id.iv_display);
//設置圖片資源
display.setImageResource(imageIds[position]);
//設置ImageView的縮放類型
display.setScaleType(ImageView.ScaleType.FIT_XY);
return view;
}
};
//設置適配器
flipper.setAdapter(baseAdapter);
}
/**
* 上一張
*
* @param v
*/
public void prev(View v) {
flipper.showPrevious();
flipper.stopFlipping();
}
/**
* 自動播放
*
* @param v
*/
public void auto(View v) {
flipper.startFlipping();
}
/**
* 下一張
*
* @param v
*/
public void next(View v) {
flipper.showNext();
flipper.stopFlipping();
}
}
9.StackView功能與用法

StackView也是AdapterViewAnimator的子類
它也是用於顯示Adapter提供的一系列View的.StackView將會心堆疊Stack的方式來顯示多個列表項
拖走StackView中處於頂端的View,下一View將會顯示出來,將上一個View拖進StackView,將進顯示 出來
showNext(),show()Previous()控制顯示下一個與上一個
9.1布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:orientation="horizontal"
tools:context="com.itheima.stackview.MainActivity">
<StackView
android:id="@+id/stackView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:loopViews="true">
</StackView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:onClick="prev"
android:text="上一個"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:onClick="next"
android:text="下一個"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
填充XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
9.2 實現
/**
* StackView
* 步驟
* 1.獲取stackview
* 2.建立適配器與資源
* 3.設置適配器
*/
public class MainActivity extends AppCompatActivity {
private StackView stackView;
private int[] imageIds = new int[]
{
R.drawable.bomb5, R.drawable.bomb6, R.drawable.bomb7
, R.drawable.bomb8, R.drawable.bomb9, R.drawable.bomb10
, R.drawable.bomb11, R.drawable.bomb12, R.drawable.bomb13
, R.drawable.bomb14, R.drawable.bomb15, R.drawable.bomb16
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
stackView = (StackView) findViewById(R.id.stackView);
/*
數據集合
*/
List<Map<String, Object>> listItem = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imageIds.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", imageIds[i]);
listItem.add(map);
}
SimpleAdapter simpleAdapter =
new SimpleAdapter(this, listItem, R.layout.images, new String[]{"image"}, new int[]{R.id.iv_display});
//設置適配器
stackView.setAdapter(simpleAdapter);
}
/**
* 上一個
*/
public void prev(View v){
stackView.showPrevious();
}
/**
* 下一個
*/
public void next(View v){
stackView.showNext();
}
}