安卓第六天笔记--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>
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>
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); } }
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>
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>
数据库创建类
/** * 数据库创建类,与维护的类 继承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; } } }
实体类
/** * 学生的封装类 * * @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; } }
数据库工具类
/** * 学生数据库访问工具类 * * @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; } }
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; } } }
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(); } }