安卓第六天笔记--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的更多相关文章

  1. 安卓开发笔记——ListView加载性能优化ViewHolder

    在前不久做安卓项目的时候,其中有个功能是爬取某网站上的新闻信息,用ListView展示,虽然做了分页,但还是觉得达不到理想流畅效果. 上网查阅了些资料,发现一些挺不错的总结,这里记录下,便于复习. 当 ...

  2. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  3. 安卓开发笔记——深入Activity

    在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我 ...

  4. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  5. 安卓开发笔记——丰富多彩的TextView

    随手笔记,记录一些东西~ 记得之前写过一篇文章<安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607. ...

  6. 安卓开发笔记——关于开源项目SlidingMenu的使用介绍(仿QQ5.0侧滑菜单)

    记得去年年末的时候写过这个侧滑效果,当时是利用自定义HorizontalScrollView来实现的,效果如下: 有兴趣的朋友可以看看这篇文件<安卓开发笔记——自定义HorizontalScro ...

  7. 安卓开发笔记——关于Handler的一些总结(上)

    接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...

  8. 安卓笔记-- ListView点击和长按监听

    其中点击监听为setOnItemClickListener() 具体实现代码如下 listView.setOnItemClickListener(new AdapterView.OnItemClick ...

  9. 安卓开发笔记(十):升级ListView为RecylerView的使用

    概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活.Recycle ...

随机推荐

  1. 使用Python画ROC曲线以及AUC值

    from:http://kubicode.me/2016/09/19/Machine%20Learning/AUC-Calculation-by-Python/ AUC介绍 AUC(Area Unde ...

  2. IIS限制ip访问

    1.禁止IP访问 http://jingyan.baidu.com/article/22fe7ced0462633002617f39.html 2.限制IP访问频率 http://q.cnblogs. ...

  3. Socket.IO 1.0 正式发布,快速可靠的实时引擎

    Socket.IO 是目前 Web 领域最火的实时引擎,用于实现基于事件的双向实时的通信.它适用于任何平台,浏览器或设备,专注于可靠性和速度.您可以将数据推送到客户端,并获得实时的计数,日志或图表. ...

  4. Keypress – 超强大!捕获键盘输入的 JavaScript 库

    Keypress 是一个强大的 JavaScript 库,用于捕获键盘输入.这是一个有非常特殊的功能的输入捕获库,它是很容易掌握和使用,并且不依赖第三方库.在网站开发中,经常会碰到需要处理键盘输入的场 ...

  5. Storm集群部署

    一. 说明 Storm是一个分布式实时计算系统,Storm对于实时计算的意义就相当于Hadoop对于批量计算的意义.对于实时性较高的系统Storm是不错的选择.Hadoop提供了map, reduce ...

  6. Python内置模块(2)

    这一部分主要介绍sys.os.hashlib和re模块.其中的re模块介绍得非常详细,是本部分的重点! 均为python3.5.1环境. 一.sys模块 sys模块涉及的主要是与python解释器相关 ...

  7. Google FlatBuffers——开源、跨平台的新一代序列化工具

    前段时间刚试用了一个序列化工具cereal,请看cereal:C++实现的开源序列化库,打算再总结下我对google proto buf序列化库的使用呢, 结果还没动手,大Google又出了一个新的. ...

  8. DBSet Class(EF基础系列11)

    Method Name Return Type          Description Add Added entity type Adds the given entity to the cont ...

  9. 基于KV Data Model实现Table Data Model

    HBase对外暴露出来的是一个表格数据模型,如下图所示 rowkey应用程序可以自己设计.每一个Cell可以保存多个版本的数据,由timestamp标示版本.应用程序可以自己指定timestamp,如 ...

  10. 在执行Action之间检验是否登录

    在执行Action之间检验是否登录,也可以在执行Action前先执行某一个操作 public class BaseController : Controller { protected string ...