安卓第六天笔记--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>
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();
}
}
安卓第六天笔记--ListView的更多相关文章
- 安卓开发笔记——ListView加载性能优化ViewHolder
在前不久做安卓项目的时候,其中有个功能是爬取某网站上的新闻信息,用ListView展示,虽然做了分页,但还是觉得达不到理想流畅效果. 上网查阅了些资料,发现一些挺不错的总结,这里记录下,便于复习. 当 ...
- 安卓开发笔记——打造万能适配器(Adapter)
为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...
- 安卓开发笔记——深入Activity
在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- 安卓开发笔记——丰富多彩的TextView
随手笔记,记录一些东西~ 记得之前写过一篇文章<安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607. ...
- 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)
记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...
- 安卓开发笔记——关于Handler的一些总结(上)
接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...
- 安卓笔记-- ListView点击和长按监听
其中点击监听为setOnItemClickListener() 具体实现代码如下 listView.setOnItemClickListener(new AdapterView.OnItemClick ...
- 安卓开发笔记(十):升级ListView为RecylerView的使用
概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活.Recycle ...
随机推荐
- _set_invalid_parameter_handler异常处理函数
VS2005之后的版本,微软增加了一些新的异常机制,新机制在出现错误时默认不通知应用程序,这时程序就崩溃了.所以这种情况下,必须调用_set_invalid_parameter_handler._se ...
- 去掉NSString中的HTML标签
经常出现字符串带有html标签.下面有个方法一步到位去掉HTML标签 <span style="font-family: 'comic sans ms', sans-serif; co ...
- grunt压缩多个js文件和css文件
压缩前的工程目录: 1.安装js,css需要的插件 使用npm安装:npm install grunt-contrib-uglify --save-dev -------->安装js压缩插件 ...
- 网络通信分享(一):数字签名,数字证书,https通信,数据加密
加密算法: 一:对称加密算法 在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的.也就是说,加密和解密都是使用的同一个密钥.因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道, ...
- Tips12: 私人定制 专属的Unity3D 脚本模板
在使用U3D的过程中,新建一个C#脚本,它包含着空的Start()和Update()函数. 根据个人习惯的不同,可能有些人有着自己的脚本风格,每次进去都增删改很麻烦,这里介绍一个更改新建脚本模板的方 ...
- jQuery的maskedinput插件 设置input掩码
一.下载插件 http://digitalbush.com/projects/masked-input-plugin/二.属性a: 表示只能输入大小写字母9:表示只能输入0-9之间的数字*:a和9的 ...
- 【算法题】Multiples of 3 and 5
Multiples of 3 and 5 原题 题意如下: 找出N以内的3和5的倍数的和. 思路 1.刚看到觉得好弱智,直接遍历一遍不就OK了吗?但是第2和第3个测试用例报了TLE,超时. 2.然后想 ...
- gene框架文档 - 路由类 gene_router
路由类 Gene\Router 介绍 Gene\Router 是gene框架的核心类之一,本框架区别于其他常见框架的最大地方就是独特.强大.简单的路由定义等.路由强大灵活,支持回调.类方法:支持res ...
- css中important的用处
今天看代码时遇到一段不理解的地方. #note_content { line-height: 22px; border: #DEDEDE 1px solid; background: #FAFAFA; ...
- python3.5.2爬虫
话不多说,都在代码里 #下载斗鱼颜值栏目主播照片 #author:ives #date:2016-8-28 21:58 #e-mail:renhanlinbsl@163.com import urll ...