在对数据库读取中,分页滑动是十分重要的,例如你浏览空间时,往下拖动有时就会出现正在加载中字样,这种是正在像服务器数据库中读取数据现象,而且规定了每页只显示多少数据,有时网速不好还要加载很长时间
如图:
我们今天要做的就是要把之前学的数据库结合起来再加上ListView+ScrollView监听事件结合起来,自己做一个加载事件。
首先定义Activity程序中的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mylayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> </LinearLayout>
然后定义ListView模板,就是我们之前学的
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mylayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:id="@+id/id" android:textSize="30px" android:layout_height="wrap_content" android:layout_width="50px"/> <TextView android:id="@+id/name" android:textSize="30px" android:layout_height="wrap_content" android:layout_width="130px"/> <TextView android:id="@+id/birthday" android:textSize="30px" android:layout_height="wrap_content" android:layout_width="180px"/> </TableRow> </TableLayout>
定义数据查询类
主要实现:getCount查询出所有满足条件的记录数
find方法,根据用户给的两个分页参数 当前页currentPage和每页显示的记录数lineSize,查询出所有相关数据,并将数据设置到List<Map<String,Object>集合,以便在ListView添加,总结就是我先给你一页数据,一页数据15个你先用listview显示,然后你显示完通知我,利用scrollview,我再给你一页数据如此
数据查询类就是给页类代码如下:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class MytabCursor { private static final String TABLENAME = "mytab" ; private SQLiteDatabase db = null ; public MytabCursor(SQLiteDatabase db) { this.db = db ; } public int getCount() { // 返回记录数 int count = 0; String sql = "SELECT COUNT(id) FROM " + TABLENAME; // 查询SQL Cursor result = this.db.rawQuery(sql, null); for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { // 采用循环的方式检索数据 count = result.getInt(0); } return count; } public List<Map<String,Object>> find(int currentPage,int lineSize){ List<Map<String,Object>> all = new ArrayList<Map<String,Object>>() ; String sql = "SELECT id,name,birthday FROM " + TABLENAME + " LIMIT ?,?"; String args[] = new String[] { String.valueOf((currentPage - 1) * lineSize), String.valueOf(lineSize) }; // 是设置参数 /* * 只查询开头数为第(currentPage - 1) * lineSize)个,只查询lineSize这么多个 */ Cursor result = this.db.rawQuery(sql, args); // 执行查询语句 for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { // 采用循环的方式检索数据 Map<String,Object> map = new HashMap<String,Object>() ; map.put("id", result.getInt(0)) ; map.put("name", result.getString(1)) ; map.put("birthday",result.getString(2)) ; all.add(map) ; } this.db.close() ; return all ; } }
然后是Activity主程序,进行分页显示:
public class MySQLiteDemo extends Activity { private ListView listView ; private SimpleAdapter simpleAdapter = null ; private LinearLayout loadLayout = null ; // 读取的脚标的视图 private TextView loadInfo = null ; // 进行信息提示 private List<Map<String,Object>> all = null ; private LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); // 表示新组件的布局参数 private SQLiteOpenHelper helper = null ; private LinearLayout mylayout = null ; private int currentPage = 1 ; private int lineSize = 15 ;//每页显示15条数据 private int allRecorders = 0 ;//保存全部记录数 private int pageSize = 1 ; // 默认在一共只有1页 private int lastItem = 0 ; // 保存最后一项 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mylayout = (LinearLayout) super.findViewById(R.id.mylayout) ; //脚标提示代码布局管理 this.loadLayout = new LinearLayout(this) ; // 定义脚标的线性布局管理器 this.loadInfo = new TextView(this) ; // 文本组件 this.loadInfo.setText("数据加载中ing...") ; // 定义提示文字 this.loadInfo.setGravity(Gravity.CENTER) ; // 文字居中显示 this.loadInfo.setTextSize(30.0f) ; // 文字大小 this.loadLayout.addView(this.loadInfo,this.layoutParams) ; // 增加组件 this.loadLayout.setGravity(Gravity.CENTER) ; this.showAllData() ; // 数据显示 this.pageSize = (this.allRecorders + this.lineSize - 1) / this.lineSize; // 计算总页数 System.out.println("pageSize = " + this.pageSize) ; System.out.println("allRecorders = " + this.allRecorders); } private void showAllData(){ // 读取全部的数据 MySQLiteDemo.this.helper = new MyDatabaseHelper(MySQLiteDemo.this); MytabCursor cur = new MytabCursor( // 实例化查询 MySQLiteDemo.this.helper.getReadableDatabase()) ; // 取得SQLiteDatabase对象 this.allRecorders = cur.getCount() ; // 取得全部记录数 this.listView = new ListView(MySQLiteDemo.this) ; MySQLiteDemo.this.all = cur.find(MySQLiteDemo.this.currentPage,MySQLiteDemo.this.lineSize) ; this.listView.addFooterView(this.loadLayout) ; // 增加读取数据的布局文件 this.simpleAdapter = new SimpleAdapter(MySQLiteDemo.this, // 上下文对象 MySQLiteDemo.this.all, // 所有要操作的数据 R.layout.tab_info, // 布局管理器 new String[] { "id", "name", "birthday" }, // map中的key new int[] { R.id.id, R.id.name, R.id.birthday }) ; this.listView.setAdapter(this.simpleAdapter); // 布局管理中的id //将已经能滚动的listview再次添加scroll的监听器 this.listView.setOnScrollListener(new OnScrollListenerImpl()) ; this.mylayout.addView(listView) ; } private class OnScrollListenerImpl implements OnScrollListener{ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { MySQLiteDemo.this.lastItem = firstVisibleItem + visibleItemCount - 1 ; // 统计是否到最后 } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (MySQLiteDemo.this.lastItem == MySQLiteDemo.this.simpleAdapter .getCount()// 已经是最底部 && MySQLiteDemo.this.currentPage < MySQLiteDemo.this.pageSize // 还有数据没读取完 && scrollState == OnScrollListener.SCROLL_STATE_IDLE ) { // 不再滑动 MySQLiteDemo.this.currentPage ++ ; MySQLiteDemo.this.listView.setSelection(MySQLiteDemo.this.lastItem) ; // 设置显示位置 MySQLiteDemo.this.appendData() ; // 增加数据 } } } private void appendData(){ // 增加数据 MytabCursor cur = new MytabCursor( // 实例化查询 MySQLiteDemo.this.helper.getReadableDatabase()) ; // 取得SQLiteDatabase对象 List<Map<String, Object>> newData = cur.find(this.currentPage, this.lineSize); this.all.addAll(newData) ; // 集合改变 this.simpleAdapter.notifyDataSetChanged() ; // 通知记录改变 } }
之后建表
实例化数据表
格式
package org.lxh.demo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASENAME = "mldn.db" ; private static final int DATABASERVERSION = 2 ; // 设置数据库的版本 private static final String TABLENAME = "mytab" ; public MyDatabaseHelper(Context context) { // 用户最关心的也肯定只是Context super(context, DATABASENAME, null, DATABASERVERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建数据表 String sql = "CREATE TABLE " + TABLENAME + "(" + "id INTEGER PRIMARY KEY ," // 在SQLite中设置为Integer、PRIMARY KEY则ID自动增长 + "name VARCHAR(50) NOT NULL ," + "birthday DATE NOT NULL" + ")"; db.execSQL(sql) ; // 执行SQL System.out.println("****************** 创建:onCreate()。"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = "DROP TABLE IF EXISTS " + TABLENAME ; db.execSQL(sql) ; System.out.println("****************** 更新:onUpgrade()。"); this.onCreate(db) ; } }
之前我们存入的数据早已写好,存入大概50多数据,存入数据方式参见前面几章
实现效果如下:
是不是对自己不断写入数据感到厌烦,不慌,接下来课我们实现一个程序去盗取人家的手机联系人,以及通话记录,看看你的他(她)有没有背着你做什么,当然,首先你要偷偷在他的手机安上这个东西。
相关推荐
4. **网络请求或数据库操作**:加载更多通常涉及到从服务器获取新数据或者从本地数据库读取未显示的数据。这里可能需要用到Http请求库(如OkHttp、Volley)或SQLiteDatabase来处理数据。 5. **更新Adapter和...
在Qt编程中,...通过以上步骤,我们可以实现Qt中TableWidget的分页加载大量数据,同时,对于ListView的模型加载也有类似的方法。这样的设计使得即使面对大量数据,也能保持界面的流畅性和应用程序的高效运行。
"android电子书(txt)分页实现"这个项目专注于解决如何在Android应用中对TXT格式的电子书进行有效的分页处理。这里我们将深入探讨实现这一功能所涉及的关键知识点。 1. **文本解析**:TXT文件是一种纯文本格式,不...
在Android中,ListView的分页通常有两种实现方式:客户端分页和服务端分页。客户端分页是在用户滚动到ListView底部时,再加载下一页数据;服务端分页则是在服务器端处理,根据请求的页码返回对应的数据。这里我们...
这份“安卓Android源码——安卓Android Launcher 桌面分页滑动代码.zip”包含的源码着重解析了如何实现桌面分页滑动的逻辑。现在我们将深入探讨这一主题,讲解其中的关键知识点。 首先,我们来看看Android Launcher...
本资源提供的是一个关于Android Launcher实现桌面分页滑动功能的源码,这对于理解和自定义Android启动器开发者来说是非常有价值的。以下是基于这个主题的详细知识点讲解: 1. **Android Launcher结构**: - ...
Android应用开发中,采用ListView...下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多…”按钮来加载新闻(模拟新闻客户端)分页数据。同时限定每次加载10条记录,但完全
8. **分组ListView**:若需要展示层次结构的数据,可以使用ExpandableListView,它支持子项的展开和折叠。 9. **优化技巧**:使用ListView时,应关注内存和性能优化,比如合理复用convertView、避免在getView()中...
总的来说,Android应用中的ListView分页显示和刷新功能是通过组合使用SQLite数据库查询、ListView的Adapter、以及异步加载策略来实现的。理解并掌握这些技术,能够帮助开发者构建出高效且用户体验良好的数据列表应用...
最近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多。 新浪微博就是使用这种方式的典型。 当用户从网络上读取微博的时候,如果一下子全部...
以上是对"知识共享-Android之ListView滑动加载、软缓存、懒加载"这一主题的详细解释,希望对你理解Android开发中的这些重要概念有所帮助。在实际开发中,熟练掌握这些技巧能够显著提升应用的性能和用户体验。
7. **数据缓存**:为了减少网络请求和提升用户体验,可以对加载的数据进行本地缓存,如使用SQLite数据库或SharedPreferences。下次加载时先从缓存中读取,没有则再发起网络请求。 8. **异常处理**:在数据加载过程...
在实现上述功能时,可能需要对ListView进行一些自定义,例如自定义适配器(Adapter)来展示数据,或者自定义头尾视图(Header和Footer)以增加下拉刷新组件等。自定义Adapter时,需要重写`getView()`方法,根据数据...
1. 数据分页加载(Lazy Loading):而不是一次性加载所有数据,我们可以实现滚动监听,只在用户滚动到列表的边缘时才加载下一部分数据。这样可以显著减少内存消耗和初始化时间。 2. 数据缓存:利用内存缓存(例如...
总结,ListView是Android中用于显示大量数据的常用组件,通过适配器填充数据并结合自定义视图,可以实现丰富的界面效果。同时,理解并运用视图复用、异步加载等优化策略,能够提升应用的性能和用户体验。在实际开发...
[四次元]Android Launcher 桌面分页滑动代码.rar [四次元]Android Launcher 源码修改可编译.rar [四次元]android 自定义对话框.rar [四次元]android-styled-dialogs 可自定义样式的dialog.zip [四次元]Android中实现...
- 对于频繁访问的数据,可以采用内存缓存或本地缓存,如SQLite数据库,提高数据读取速度。 在QSearchListviewDemo这个项目中,我们可以看到这些技术的实践应用。通过阅读和学习该项目的代码,开发者可以了解到如何...
本篇将深入探讨如何对ListView进行优化,以及如何实现图片的异步加载和缓存策略,以避免这些问题。 **1. ListView优化** ListView的优化主要涉及以下几个方面: 1.1 **convertView复用机制**:ListView的Adapter...
8. **数据适配器(Adapter)**:根据不同的数据源(如SQLite数据库、网络API等),你可能需要自定义适配器,以正确地将数据绑定到ListView的各个视图(ViewHolder)上。 在安卓毕业设计或课程设计中,实现ListView的...
4. **数据加载**:在触发加载更多后,通常会发起网络请求或者从本地数据库读取新数据。加载完成后,更新适配器的数据集,并调用adapter.notifyDataSetChanged()通知ListView数据已更新。 5. **动画效果**:为了提供...