Presentation is loading. Please wait.

Presentation is loading. Please wait.

第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、

Similar presentations


Presentation on theme: "第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、"— Presentation transcript:

1 第11章 ListView延迟加载效果 授课老师:高成珍 QQ号:1281147324 QQ群:287966120、314753495
网络资源:

2 本章案例效果分析

3 ListView延迟加载原理 为了提高ListView的效率和应用程序的性能,对于列表项比较多的ListView,Android应用程序通常不会一次性加载ListView的所有项信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并添加到ListView控件中,这样可以极大的改善应用程序的性能和用户体验。 具体过程如下: ListView初始化时,预加载N条记录; 用户滑动ListView控件到最后一条记录时,显示加载提示信息; 从后台额外加载M条数据; 加载完毕后更新ListView。

4 ListView延迟加载原理 ListView延迟加载过程中涉及到以下几个变量:  totalCount:数据库中所包含的所有新闻的数目;
 loadedCount:列表中已经加载的新闻的数目;  loadItemNum:每次加载时,加载的新闻数目;  lastItem:列表中可见的最后一项的序号; 此外,显示加载提示信息的控件,并不是直接显示在屏幕的底部,而 是随着ListView的滚动而显示的,位于ListView的最后,属于ListView的 一部分,实际上它也是作为ListView中的一项。只是它比较特殊,它的结 构与其它普通项不同,不管何时添加到ListView中,它永远是ListView的 最后一项,可通过ListView的addFooterView()方法添加到ListView中。

5 ListView延迟加载原理 ListView延迟加载的本质就是根据ListView滚动条的状态来决定是否额外加载数据,为ListView添加滚动事件监听器监听滚动状态变化,需实现该监听器中的两个抽象方法:onScroll() 和onScrollStateChanged()。 onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) 监听滚动事件,包含四个参数,view表示滚动的控件,在此为ListView;firstVisibleItem表示该控件上用户可见的第1项的序号;visibleItemCount表示该控件上用户可见项的数目;totalItemCount表示该控件上一共有多少项,包括底部显示加载提示信息的项。且有lastItem= firstVisibleItem + visibleItemCount – 1。减1是因为可见项已包含firstVisibleItem项。当所有的记录都加载完时,就不需要显示底部的提示信息,所以需在onScroll()方法中判断loadedCount是否大于等于totalCount的值。

6 ListView延迟加载原理 onScrollStateChanged(AbsListView view, int scrollState) 监听 滚动条的状态发生变化事件,包含两个参数,view表示滚动的控件,在此 为ListView;scrollState表示滚动条的状态。该方法主要判断滚动条是否 不能再滚动了,即状态为:OnScrollListener.SCROLL_STATE_IDLE。 滚动条不能再滚动有两种情况,一是向下滚动到最后一项;二是向上 滚动到第一项。在此需要处理的是第一种,所以还需要判断lastItem是否 等于loadedCount。然后判断是否还有数据没有加载完毕,如果还有即 loadedCount<totalCount,则需要加载数据,具体加载多少项呢?默 认情况下每次加载4项,如果最后不足4项,则加载所有剩余项。

7 SQLite数据库存储数据 在Android平台上,嵌入了一个轻量级的关系型数据库-SQLite。SQLite并没有包含大型客户/服务器数据库(如Oracle、SQL Server)的所有特性,但它包含了操作本地数据的所有功能,简单易用、反应快。 SQLite内部只支持 NULL、INTEGER、REAL(浮点数)、TEXT(字符串文本)和BLOB(二进制对象)这五种数据类型,但实际上SQLite也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成上面对应的数据类型。

8 SQLite数据库存储数据 SQLite最大的特点是可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以把字符串类型的值存入INTEGER类型字段中,或者在布尔型字段中存放数值类型等。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 SQLite允许存入数据时忽略底层数据列实际的数据类型,因此SQLite在解析建表语句时,会忽略建表语句中跟在字段名后面的数据类型信息。create table person_tb (id integer primary key autoincrement, name varchar(20)),在编写建表语句时可以省略数据列后面的类型声明。

9 SQLite数据库存储数据 常见SQL标准语句
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句 如:select * from person 分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录 select * from Account limit 5 offset 3 插入语句:insert into 表名(字段列表) values(值列表)。 如:insert into person(name, age) values(‘张三’,26) 更新语句:update 表名 set 字段名=值 where 条件子句。 如:update person set name=‘李四‘ where id=10 删除语句:delete from 表名 where 条件子句。 如:delete from person where id=10

10 SQLite数据库相关类 SQLiteOpenHelper是Android提供的管理数据的工具类,主要用于数据库的创建、打开和版本更新。一般用法是创建SQLiteOpenHelper类的子类,并扩展它的onCreate()和onUpgrade()方法(这两个方法是抽象的,必须扩展),选择性的扩展它的onOpen()方法。 SQLiteDatabase getReadableDatabase():以读写的方式打开SQLiteDatabase对象,内部调用getWritableDatabase()方法; SQLiteDatabase getWritableDatabase():以写的方式打开SQLiteDatabase对象,一旦打开成功,将会缓存该数据库对象; abstract void onCreate(SQLiteDatabase db):当数据库第一次被创建的时候调用该方法; abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):当数据库需要更新的时候调用该方法;

11 SQLite数据库相关类 调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取SQLiteDatabase实例,如果数据库不存在,Android系统会自动生成一个数据库,然后调用onCreate()方法,在onCreate()方法里生成数据库表结构及添加应用需要的初始化数据。 onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件 升级时才需改变版本号,数据库的版本是由开发人员控制的,假设数据库 现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升 级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一 目的,可以把数据库版本设置为2,并在onUpgrade()方法里实现表结构的 更新。onUpgrade()方法可以根据原版本号和目标版本号进行判断,然后 作出相应的表结构及数据更新。

12 SQLite数据库相关类 SQLiteDatabase类代表数据库(底层就是一个数据库文件),该类封装了数据库操作的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作。对SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和create table之类有更改行为的SQL语句;而rawQuery()方法用于执行select语句。 execSQL(String sql,Object[] bindArgs):执行带占位符的SQL语句,如果sql语句中没有占位符,则第二个参数可传null; execSQL(String sql):执行SQL语句; rawQuery(String sql,String[] selectionArgs):执行带占位符的SQL查询。

13 SQLite数据库存储数据 SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query() 。 例如:Cursor query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy,String having,String orderBy, String limit)方法各参数的含义 table:表名,如果是多表联合查询,可以用逗号将多个表名分开; columns:要查询的列名,可以是多列。 selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”。 selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。 groupBy:相当于select语句group by关键字后面的部分 having:相当于select语句having关键字后面的部分 orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc; limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

14 SQLite数据库相关类 Cursor接口主要用于存放查询记录的接口,Cursor是结果集游标,用于对结果集进行随机访问,如果熟悉JDBC,可发现Cursor与JDBC中的ResultSet作用很相似,提供了如下方法来移动查询结果的记录指针。 move(int offset):将记录指针向上或向下移动指定的行数。offset为正数就向下移动,为负数就向上移动; moveToNext()方法可以将游标从当前记录移动到下一记录,如果已经移过了结果集的最后一条记录,返回结果为false,否则为true; moveToPrevious()方法用于将游标从当前记录移动到上一记录,如果已经移过了结果集的第一条记录,返回值为false,否则为true ; moveToFirst()方法用于将游标移动到结果集的第一条记录,如果结果集为空,返回值为false,否则为true ; moveToLast()方法用于将游标移动到结果集的最后一条记录,如果结果集为空,返回值为false,否则为true。

15 数据库操作的一般步骤 使用SQLiteDatabase进行数据库操作的步骤如下:
调用SQLiteDatabase的方法来执行SQL语句; 操作SQL语句的执行结果; 关闭SQLiteDatabase,回收资源。

16 SQLite数据库 数据库文件位于/data/data/你的程序的包名/databases/中,可通过DDMS工具将该文件夹下的数据库导出来,然后下载具体的图形化界面进行查看。也可通过Android SDk的tool目录下提供的sqlite3.exe命令打开数据库文件,类似于MySQL提供的命令行窗口。 注意:通过命令行查看数据库内容时,中文在命令行上会显示乱码。

17 注意事项 在开发包含数据库操作的应用时,如果对数据库辅助类中的onCreate()方法进行了更改,例如数据库的建表语句或者初始化值有变化时。测试时,一定要先把手机中的数据库删除。否则由于手机上已经存在该数据库,系统不会重复调用onCreate()方法,从而也就达不到更改目的。 想一想 数据库的创建过程是怎么 样的?数据库的后缀名有 要求吗?

18


Download ppt "第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、"

Similar presentations


Ads by Google